Efter mycket förvirring och själssökande kunde jag så småningom spåra detta till att dikter i Python var oordnade (åtminstone före 3.6) och MongoDB förväntade sig en beställd BSON-ordbok.
Använda ett OrderedDict som påpekats i Hur man blir beställd ordböcker på pymongo? lös detta:
>>> from collections import OrderedDict
>>> client.admin.command(
OrderedDict([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Ett annat alternativ är att använda en SON
objekt från BSON.
>>> import bson
>>> client.admin.command(
bson.son.SON([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Ett annat tillvägagångssätt är att skicka Javascript till MongoDB med hjälp av eval()
funktion:
>>> client.admin.eval(
"db.runCommand({'renameCollection':'db1.coll2', 'to':'db2.coll2'})")
{u'ok': 1.0}
Jag tycker att den råa Javascript-versionen är mindre pytonisk men är användbar eftersom den tillät mig att testa MongoDB-funktionaliteten utan att behöva starta ett MongoDB-skal. Jag har inte heller sett det nämnt mycket på PyMongo StackOverflow-frågor så jag tyckte det var värt att ta med här.