Efter megen forvirring og sjælesøgning, var jeg til sidst i stand til at spore dette ned til, at diktater i Python var uordnede (i hvert fald før 3.6), og MongoDB forventede en bestilt BSON-ordbog.
Brug af en OrderedDict som angivet i Sådan bliver du bestilt ordbøger i pymongo? løse dette:
>>> from collections import OrderedDict
>>> client.admin.command(
OrderedDict([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Et andet alternativ er at bruge en SON
objekt fra BSON.
>>> import bson
>>> client.admin.command(
bson.son.SON([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
En anden fremgangsmåde er at sende Javascript til MongoDB ved hjælp af eval()
funktion:
>>> client.admin.eval(
"db.runCommand({'renameCollection':'db1.coll2', 'to':'db2.coll2'})")
{u'ok': 1.0}
Jeg finder den rå Javascript-version mindre pytonisk, men er nyttig, fordi den tillod mig at teste MongoDB-funktionaliteten uden at skulle starte en MongoDB-skal. Jeg har heller ikke set det nævnt meget på PyMongo StackOverflow-spørgsmål, så tænkte, at det var værd at inkludere her.