sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo copio una colección de una base de datos a otra base de datos en el mismo servidor usando PyMongo?

Después de mucha confusión y examen de conciencia, finalmente pude rastrear esto hasta que los dictados en Python no estaban ordenados (al menos antes de 3.6) y MongoDB esperaba un diccionario BSON ordenado.

Usar un OrderedDict como se indica en Cómo recibir pedidos diccionarios en pymongo? resuelve esto:

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

Otra alternativa es usar un SON objeto de BSON.

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

Otro enfoque es pasar Javascript a MongoDB usando eval() función:

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

Encuentro que la versión de Javascript sin procesar es menos pitónica pero es útil porque me permitió probar la funcionalidad de MongoDB sin tener que iniciar un shell de MongoDB. Tampoco he visto que se mencione mucho en las preguntas de PyMongo StackOverflow, así que pensé que valía la pena incluirlo aquí.