2013-02-17 15 views
8

pracuję nad pymongo i to jest mój dokument:upsert i Multi flagi pymongo

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

Chciałbym rozbroić „przypisanie” własność wszystkich takich dokumentów. udało mi się to osiągnąć na powłoce Mongo wykonując:

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

tj Zdałem upsert i wielu flagę jako ostatnie dwa parametry do funkcji funkcji aktualizacji na gromadzenie użytkowników. Jednak zrobiłem to z pymongo:

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

Ale interpreter Pythona wyrzucił błąd w następujący sposób:

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 

Gdzie jestem będzie niewłaściwy?

+0

spojrzenie na http://stackoverflow.com/questions/14443478/remove-subfields-from-mongodb-document może znajdziesz coś znajomego – mderk

Odpowiedz

24

Problem polega na tym, że dwie flagi, które przechodzą, nie są upsert i multi. Na podstawie dokumentacji PyMongo: Collection.update (znaleziono here), wygląda na to, że możesz przekazywać wartości dla opcji upsert i manipulate, chociaż nie jestem tego pewien.

Wszystko, co musisz zrobić, aby rozwiązać ten problem, to jedna z najbardziej niesamowitych cech Pythona: nazwane argumenty. Określając, które opcje przechodzisz na update, dodajesz klarowność do kodu, a także upewniasz się, że takie wypadki się nie zdarzają.

W tym przypadku chcemy przekazać opcje upsert=False i multi=True.

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

oh wow! Jesteś niesamowity, dziękuję bardzo – swaroopsm