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?
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.