più operatori di aggiornamento mongo in una singola istruzione?

Posso combinare $ pushAll e $ inc in una dichiarazione?

Prima di combinare, questo funziona bene:

db.createCollection("test"); db.test.insert({"name" : "albert", "bugs" : []}); db.test.update({"name":"albert"}, {"$pushAll" : {"bugs" : [{"name":"bug1", "count":1}]}}); db.test.update({"name":"albert"}, {"$inc" : {"bugs.0.count" : 1}}); db.test.update({"name":"albert"}, {"$pushAll" : {"bugs" : [{"name":"bug2", "count":1}]}}); 

Ma quando provo a combinarlo in questo modo:

 db.createCollection("test"); db.test.insert({"name" : "albert", "bugs" : []}); db.test.update({"name":"albert"}, {"$pushAll" : {"bugs" : [{"name":"bug1", "count":1}]}}); db.test.update({"name":"albert"}, { "$pushAll" : {"bugs" : [{"name":"bug2", "count":1}]}, "$inc" : {"bugs.0.count" : 1} } ); 

Questo errore si verifica:

 have conflicting mods in update 

Mi chiedo che sia ansible farlo, e inoltre, immagino che combinando più di solo pushAll e inc, ma non sono sicuro se questo è supportato o no?


aggiornamento marzo 23, 2012

Ho provato più $ inc su diversi elementi di un array, e funziona (anche se non correttamente. Citato dalla risposta qui sotto per chiarire perché questo doensnt funziona bene e cosa funziona: The correct way to increment both fields is as follows: > db.test.update({"name":"albert"}, {"$inc" : {"bugs.0.count" : 1, "bugs.1.count" : 1}}) :

 db.test.update({"name":"albert"}, { "$inc" : {"bugs.0.count" : 1}, "$inc" : {"bugs.1.count" : 1} } ); 

E questa combinazione di $ set e $ inc su diversi elementi di un array funziona anche:

 db.test.update({"name":"albert"}, { "$set" : {"bugs.0.test" : {"name" : "haha"}}, "$inc" : {"bugs.0.count" : 1}, "$inc" : {"bugs.1.count" : 1} } ); 

Ma combinare uno di questi con $ push o $ pushAll, tutto andrà errore.

Quindi, la mia conclusione attuale è che non si tratta di più operazioni su più elementi all’interno dello stesso array che è il problema, ma la combinazione di queste operazioni con $ push o $ pushAll che può modificare l’array è il problema.

Più aggiornamenti possono essere eseguiti sullo stesso documento, purché tali aggiornamenti non siano in conflitto (da qui l’errore “avere modifiche in conflitto in aggiornamento”).

Perché “$ push”: {“bug”: [{“name”: “bug1”, “count”: 1}]} e “$ inc”: {“bugs.0.count”: 1} stanno entrambi tentando di modificare la stessa porzione del documento (cioè la matrice “bug”), essi sono in conflitto.

È ansible combinare più aggiornamenti se ciascuno interessa una parte diversa del documento:

per esempio:

 > db.test.drop() true > db.test.save({ "_id" : 1, "name" : "albert", "bugs" : [ ] }) > db.test.update({"name":"albert"}, {"$pushAll" : {"bugs" : [{"name":"bug1", "count":1}]}, "$inc" : {"increment" : 1}, $set:{"note":"Here is another field."}}) > db.test.find() { "_id" : 1, "bugs" : [ { "name" : "bug1", "count" : 1 } ], "increment" : 1, "name" : "albert", "note" : "Here is another field." } > 

L’aggiornamento conteneva tre diverse operazioni ($ pushAll, $ inc e $ set), ma era in grado di completare correttamente, poiché ogni operazione riguardava una parte diversa del documento.

Mi rendo conto che questo non è esattamente quello che speravi di fare, ma spero che ti fornisca una migliore comprensione di come funzionano gli aggiornamenti e forse fornisci alcune idee su come i tuoi aggiornamenti e / o documenti possano essere ristrutturati per eseguire la funzionalità che l’applicazione richiede. In bocca al lupo.