Pymongo: FindAndModify - "لا شيء من هذا القبيل" يتم إرجاعه
سؤال
أعتقد أن هناك خطأ في Pymongo (أو ، على الأقل ، الوثائق) مما يجعل من المستحيل تشغيل أ findandupdate
استفسار.
هذا ما يحدث. عندما أركض:
result = db.command({
'findandmodify': 'my_collection',
'query': {'foo': 'bar'},
'update': {'$set': {'status': 'queued'}},
})
الاستعلام الذي يتم إرساله بالفعل إلى الخادم هو:
{ 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … }
نلاحظ أن query
الحجة أول, ، و findandmodify
هو ثانيا.
لكن هذا يؤدي إلى ترمي الخادم:
OperationFailure: command { 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … } failed: no such cmd
لأن الخادم يتوقع findandmodify
أن تكون أولاً (يتم ترتيب DICTs BSON).
هل هناك أي حل بديل لهذا؟
المحلول
بالنسبة للغات التي لا تحتوي على نوع من القولان المدمج ، يتضمن برامج تشغيل Mongo واحدة. في بيثون هذا هو نوع الابن: http://api.mongodb.org/python/1.4٪2b/api/pymongo/son.html. ستحتاج إلى استخدام ذلك لجميع الأوامر.
إذا لم يفشل ذلك ، فتأكد من أنك تستخدم أحدث إصدار من قاعدة البيانات لأن FindAndModify هو ميزة جديدة.
نصائح أخرى
API Pymongo الحالي قد تم العثور عليه https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/collection.py#l1035
قد يكون أحد الحلول هو بناء إصدار JavaScript من الأمر ونقله إلى db.eval ().
db.eval('db.runCommand({"findandmodify": "my_collection", "query": {"foo": "bar"}, "update": {"$set": {"status": "queued"}},})')
تكمن المشكلة في أنه ، كما ذكر أليكس ، ليس للديثون أي أمر ، لذلك ستحتاج إلى بناء السلسلة أكثر أو أقل يدويًا.
انظر وثائق Pymongo:
لاحظ أن ترتيب المفاتيح في مستند الأوامر مهم (يجب أن يأتي "الفعل" أولاً) ، لذلك يجب أن تستخدم الأوامر التي تتطلب مفاتيح متعددة (على سبيل المثال FindAndModify) مثيلًا لابن أو سلسلة و Kwargs بدلاً من قول بيثون.