2013-02-17 27 views
8

में मल्टी झंडा मैं pymongo पर काम कर रहा हूँ और यह मेरा दस्तावेज है:Upsert और pymongo

{ 
    "_id": ObjectId("51211b57f07ddaa377000000"), 
    "assignments": { 
    "0": { 
     "0": { 
     "_id": ObjectId("5120dd7400a4453d58a0d0ec") 
     }, 
     "1": { 
     "_id": ObjectId("5120dd8e00a4453d58a0d0ed") 
     }, 
     "2": { 
     "_id": ObjectId("5120ddad00a4453d58a0d0ee") 
     } 
    } 
    }, 
    "password": "my_passwd", 
    "username": "john" 
} 

मैं ऐसे सभी दस्तावेज़ों की "काम" संपत्ति अनसेट करना चाहते हैं। मैं ऐसा करके मोंगो खोल पर इस लक्ष्य को हासिल करने में सक्षम था:

db.users.update({}, {$unset: {"assignments": 1}}, false, true) 

जैसे कि, मैं उन संग्रह पर अद्यतन समारोह समारोह के लिए पिछले दो पैरामीटर के रूप में Upsert और बहु ​​ध्वज पारित कर दिया। हालांकि मैं pymongo साथ ऐसा किया:

db.users.update({}, {"$unset": {"assignments": 1}}, False, True) 

लेकिन इस प्रकार अजगर दुभाषिया एक त्रुटि फेंक दिया:

File "notes/assignment.py", line 34, in <module> 
    db.users.update({}, {"$unset": {"assignments": 1}}, False, True) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 481, in update 
    check_keys, self.__uuid_subtype), safe) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 852, in _send_message 
    rv = self.__check_response_to_last_error(response) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 795, in __check_response_to_last_error 
    raise OperationFailure(details["err"], details["code"]) 
pymongo.errors.OperationFailure: Modifiers and non-modifiers cannot be mixed 

कहाँ मैं गलत हो रहा हूँ?

+0

http://stackoverflow.com/questions/14443478/remove-subfields-from-mongodb-document पर नज़र हो सकता है आप अरे वाह कुछ परिचित – mderk

उत्तर

24

समस्या यह है कि आप जिन दो झंडे में गुजर रहे हैं वे upsert और multi नहीं हैं। PyMongo के Collection.update (here मिला) के दस्तावेज़ीकरण के आधार पर, ऐसा लगता है कि आप upsert और manipulate विकल्पों के मानों में गुजर रहे हैं, हालांकि मैं निश्चित नहीं हूं।

इसे हल करने के लिए आपको बस इतना करना है कि पाइथन की सबसे शानदार सुविधाओं में से एक का उपयोग किया गया है: नाम तर्क। यह निर्दिष्ट करके कि आप कौन से विकल्प update पर जा रहे हैं, आप यह सुनिश्चित करने के अलावा अपने कोड में स्पष्टता जोड़ते हैं कि ऐसा नहीं होता है।

इस मामले में, हम विकल्प upsert=False और multi=True पास करना चाहते हैं।

db.users.update({}, { "$unset": { "assignments": 1 } }, upsert=False, multi=True) 
+0

मिल जाएगा! आप बहुत बहुत धन्यवाद कर रहे हैं – swaroopsm