Po spoustě zmatků a hledání duše jsem to nakonec dokázal vystopovat až k diktátům v Pythonu, které nebyly uspořádané (alespoň před 3.6) a MongoDB očekával uspořádaný slovník BSON.
Použití OrderedDict, jak je uvedeno v Jak získat objednávku slovníky v pymongu? vyřešit toto:
>>> from collections import OrderedDict
>>> client.admin.command(
OrderedDict([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Další alternativou je použití SON
objekt z BSON.
>>> import bson
>>> client.admin.command(
bson.son.SON([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Dalším přístupem je předání Javascriptu MongoDB pomocí eval()
funkce:
>>> client.admin.eval(
"db.runCommand({'renameCollection':'db1.coll2', 'to':'db2.coll2'})")
{u'ok': 1.0}
Nezpracovaná verze Javascriptu je méně pythonic, ale je užitečná, protože mi umožnila otestovat funkčnost MongoDB, aniž bych musel spouštět shell MongoDB. Také jsem toho moc nezmiňoval v otázkách PyMongo StackOverflow, takže si myslím, že to stojí za to sem zahrnout.