Sau rất nhiều bối rối và tìm kiếm linh hồn, cuối cùng tôi đã có thể theo dõi điều này để tìm ra các lệnh trong Python không có thứ tự (ít nhất là trước 3.6) và MongoDB mong đợi một từ điển BSON có thứ tự.
Sử dụng một OrderedDict như được chỉ ra trong Cách đặt hàng từ điển trong pymongo? giải quyết vấn đề này:
>>> from collections import OrderedDict
>>> client.admin.command(
OrderedDict([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Một giải pháp thay thế khác là sử dụng SON
đối tượng từ BSON.
>>> import bson
>>> client.admin.command(
bson.son.SON([('renameCollection','db1.coll2'), ('to','db2.coll2')]))
{u'ok': 1.0}
Một cách tiếp cận khác là chuyển Javascript sang MongoDB bằng cách sử dụng eval()
chức năng:
>>> client.admin.eval(
"db.runCommand({'renameCollection':'db1.coll2', 'to':'db2.coll2'})")
{u'ok': 1.0}
Tôi thấy phiên bản Javascript thô ít phức tạp hơn nhưng hữu ích vì nó cho phép tôi kiểm tra chức năng MongoDB mà không cần phải kích hoạt trình bao MongoDB. Tôi cũng không thấy nó được đề cập nhiều trong các câu hỏi của PyMongo StackOverflow nên tôi nghĩ nó đáng để đưa vào đây.