MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como copio uma coleção de um banco de dados para outro banco de dados no mesmo servidor usando o PyMongo?


Depois de muita confusão e busca de alma, finalmente consegui rastrear isso para dicts em Python não ordenados (pelo menos antes de 3.6) e MongoDB esperando um dicionário BSON ordenado.

Usando um OrderedDict conforme indicado em Como fazer um pedido dicionários em pymongo? resolver isso:
>>> from collections import OrderedDict
>>> client.admin.command(
    OrderedDict([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}

Outra alternativa é usar um SON objeto do BSON.
>>> import bson
>>> client.admin.command(
    bson.son.SON([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}

Outra abordagem é passar Javascript para o MongoDB usando o eval() função:
>>> client.admin.eval(
    "db.runCommand({'renameCollection':'db1.coll2', 'to':'db2.coll2'})") 
{u'ok': 1.0}

Acho a versão raw do Javascript menos pythonic, mas é útil porque me permitiu testar a funcionalidade do MongoDB sem ter que acionar um shell do MongoDB. Eu também não vi muito mencionado nas perguntas do PyMongo StackOverflow, então achei que vale a pena incluir aqui.