Nach viel Verwirrung und Seelensuche konnte ich dies schließlich darauf zurückführen, dass Diktate in Python ungeordnet waren (zumindest vor 3.6) und MongoDB ein geordnetes BSON-Wörterbuch erwartete.
Verwenden eines OrderedDict, wie in How to get ordered beschrieben Wörterbücher in Pymongo? lösen Sie dies:
>>> from collections import OrderedDict
>>> client.admin.command(
OrderedDict([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Eine weitere Alternative ist die Verwendung eines SON
Objekt von BSON.
>>> import bson
>>> client.admin.command(
bson.son.SON([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Ein anderer Ansatz besteht darin, Javascript mithilfe von eval()
an MongoDB zu übergeben Funktion:
>>> client.admin.eval(
"db.runCommand({'renameCollection':'db1.coll2', 'to':'db2.coll2'})")
{u'ok': 1.0}
Ich finde die rohe Javascript-Version weniger pythonisch, aber nützlich, weil ich damit die MongoDB-Funktionalität testen konnte, ohne eine MongoDB-Shell starten zu müssen. Ich habe auch nicht gesehen, dass es in PyMongo StackOverflow-Fragen oft erwähnt wurde, also dachte ich, es lohnt sich, es hier aufzunehmen.