След много объркване и дълбоко търсене, в крайна сметка успях да проследя това до dicts в Python, които не бяха подредени (поне преди 3.6) и MongoDB очакваше подреден BSON речник.
Използване на OrderedDict, както е посочено в Как да получите поръчка речници в pymongo? разреши това:
>>> from collections import OrderedDict
>>> client.admin.command(
OrderedDict([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Друга алтернатива е да използвате SON
обект от BSON.
>>> import bson
>>> client.admin.command(
bson.son.SON([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Друг подход е да прехвърлите Javascript към MongoDB с помощта на eval()
функция:
>>> client.admin.eval(
"db.runCommand({'renameCollection':'db1.coll2', 'to':'db2.coll2'})")
{u'ok': 1.0}
Намирам необработената версия на Javascript за по-малко питонична, но е полезна, защото ми позволи да тествам функционалността на MongoDB, без да се налага да стартирам обвивка на MongoDB. Също така не съм го виждал да се споменава много във въпросите на PyMongo StackOverflow, така че реших, че си струва да го включа тук.