2013-02-17 9 views
8

ich auf pymongo arbeitete und das ist mein Dokument:Upsert und Multi-Flag in pymongo

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

Ich mag würde die „Zuordnung“ Eigenschaft aller dieser Dokumente unscharf zu schalten. Ich konnte dies auf dem Mongo Mantel erreichen, indem Sie:

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

das heißt, ich habe die Upsert und Multi-Flag als die letzten beiden Parameter auf die Update-Funktion Funktion auf Benutzer Sammlung übergeben. Jedoch habe ich dies mit pymongo tat:

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

Aber der Python-Interpreter warf einen Fehler wie folgt:

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 

Wohin gehe ich falsch?

+0

Blick auf http://stackoverflow.com/questions/14443478/remove-subfields-from-mongodb-document vielleicht werden Sie etwas Bekanntes – mderk

Antwort

24

Das Problem ist, dass die beiden Flags, die Sie übergeben, nicht upsert und multi sind. Basierend auf der Dokumentation von PyMongo's Collection.update (gefunden here), sieht es so aus, als ob Sie Werte für die upsert und manipulate Optionen übergeben, obwohl ich nicht sicher bin.

Alles, was Sie tun müssen, um dies zu lösen, ist eine der großartigsten Funktionen von Python: benannte Argumente. Indem Sie angeben, welche Optionen Sie an update übergeben, fügen Sie Ihrem Code Klarheit hinzu und sorgen dafür, dass Unfälle wie diese nicht passieren. In diesem Fall möchten wir die Optionen upsert=False und multi=True übergeben.

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

oh wow finden! Du bist großartig, vielen Dank – swaroopsm