MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come faccio a copiare una raccolta da un database a un altro database sullo stesso server utilizzando PyMongo?

Dopo molta confusione e ricerca interiore, alla fine sono stato in grado di rintracciarlo in dicts in Python non ordinato (almeno prima della 3.6) e MongoDB che si aspettava un dizionario BSON ordinato.

Utilizzo di un OrderedDict come indicato in Come ottenere l'ordine dizionari in pymongo? risolvi questo:

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

Un'altra alternativa è usare un SON oggetto da BSON.

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

Un altro approccio è passare Javascript a MongoDB usando eval() funzione:

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

Trovo la versione grezza di Javascript meno pythonic ma è utile perché mi ha permesso di testare la funzionalità MongoDB senza dover avviare una shell MongoDB. Inoltre non l'ho visto menzionato molto nelle domande di PyMongo StackOverflow, quindi ho pensato che valesse la pena includerlo qui.