Po wielu zamieszaniu i poszukiwaniach duszy, w końcu udało mi się wyśledzić to, że wpisy w Pythonie są nieuporządkowane (przynajmniej przed 3.6) i MongoDB oczekując uporządkowanego słownika BSON.
Korzystanie z OrderedDict, jak wskazano w Jak zamówić słowniki w pymongo? rozwiązać ten problem:
>>> from collections import OrderedDict
>>> client.admin.command(
OrderedDict([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Inną alternatywą jest użycie SON
obiekt z BSON.
>>> import bson
>>> client.admin.command(
bson.son.SON([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Innym podejściem jest przekazanie JavaScript do MongoDB za pomocą eval()
funkcja:
>>> client.admin.eval(
"db.runCommand({'renameCollection':'db1.coll2', 'to':'db2.coll2'})")
{u'ok': 1.0}
Uważam, że surowa wersja JavaScript jest mniej pythoniczna, ale jest przydatna, ponieważ pozwoliła mi przetestować funkcjonalność MongoDB bez konieczności uruchamiania powłoki MongoDB. Nie widziałem też, by wspominano o tym zbyt wiele w pytaniach dotyczących PyMongo StackOverflow, więc pomyślałem, że warto je tutaj uwzględnić.