我正在尝试将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" }
答案 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问题上提到太多,所以认为它值得包括在这里。