如何使用PyMongo将集合从一个数据库复制到同一服务器上的另一个数据库?

时间:2017-02-15 09:16:41

标签: python mongodb pymongo

我正在尝试将MongoDB集合从一个数据库复制到同一服务器上的另一个数据库。

from pymongo import MongoClient
client = MongoClient()
client.db1.coll1.insert({'content':'hello world'})

我想在同一台服务器上将db1.coll复制到db2.coll2

我尝试按照How to copy a collection from one database to another in MongoDB中描述的“复制并移动”方法进行操作,但这在pymongo中不起作用。

特别是复制步骤

client.db1.coll1.aggregate([{'$out':'coll2'}])

有效,但在尝试执行移动时出现错误:

>>> client.admin.command({'renameCollection':'db1.coll2', 'to':'db2.coll2'})
OperationFailure: no such command: 'to', bad cmd: '{ to: "db2.coll2", renameCollection: "db1.coll2" }

1 个答案:

答案 0 :(得分:1)

经过大量的困惑和灵魂搜索之后,我最终能够跟踪Python中的序列(至少在3.6之前)并且MongoDB期望订购BSON字典。

使用How to get ordered dictionaries in pymongo?中指出的OrderedDict解决此问题:

>>> from collections import OrderedDict
>>> client.admin.command(
    OrderedDict([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}

另一种方法是使用BSON的SON对象。

>>> import bson
>>> client.admin.command(
    bson.son.SON([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}

另一种方法是使用eval()函数将Javascript传递给MongoDB:

>>> client.admin.eval(
    "db.runCommand({'renameCollection':'db1.coll2', 'to':'db2.coll2'})") 
{u'ok': 1.0}

我发现原始Javascript版本不那么pythonic但很有用,因为它允许我测试MongoDB功能而无需启动MongoDB shell。我也没有看到它在PyMongo StackOverflow问题上提到太多,所以认为它值得包括在这里。