2017-02-15 4 views
0

Я пытаюсь скопировать коллекцию MongoDB из одной базы данных в другую базу данных на том же сервере.Как скопировать коллекцию из одной базы данных в другую базу данных на том же сервере, используя PyMongo?

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

После много путаницы и самоанализа, я был в конце концов способный отслеживать это до того, как в Python будет неупорядочено (по крайней мере до 3.6), и MongoDB ожидает упорядоченный словарь BSON.

Использование OrderedDict как указано в How to get ordered dictionaries in pymongo? решить эту проблему:

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

Другой альтернативой является использование SON объекта из BSON.

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

Другой подход состоит в передаче Javascript для MongoDB, используя eval() функцию:

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

я найти исходный вариант Javascript менее вещий, но полезно, потому что это позволило мне проверить функциональность MongoDB без необходимости запустите оболочку MongoDB. Я также не видел, чтобы он много упоминал о вопросах PyMongo StackOverflow, поэтому подумал, что здесь стоит упомянуть.