Depois de muita confusão e busca de alma, finalmente consegui rastrear isso para dicts em Python não ordenados (pelo menos antes de 3.6) e MongoDB esperando um dicionário BSON ordenado.
Usando um OrderedDict conforme indicado em Como fazer um pedido dicionários em pymongo? resolver isso:
>>> from collections import OrderedDict
>>> client.admin.command(
OrderedDict([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Outra alternativa é usar um
SON
objeto do BSON. >>> import bson
>>> client.admin.command(
bson.son.SON([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Outra abordagem é passar Javascript para o MongoDB usando o
eval()
função:>>> client.admin.eval(
"db.runCommand({'renameCollection':'db1.coll2', 'to':'db2.coll2'})")
{u'ok': 1.0}
Acho a versão raw do Javascript menos pythonic, mas é útil porque me permitiu testar a funcionalidade do MongoDB sem ter que acionar um shell do MongoDB. Eu também não vi muito mencionado nas perguntas do PyMongo StackOverflow, então achei que vale a pena incluir aqui.