Pymongo: FindAndModify - "لا شيء من هذا القبيل" يتم إرجاعه

StackOverflow https://stackoverflow.com/questions/2350238

  •  23-09-2019
  •  | 
  •  

سؤال

أعتقد أن هناك خطأ في 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 بدلاً من قول بيثون.

http://api.mongodb.org/python/2.1/api/pymongo/database.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top