MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie aktualisieren Sie Objekte im Array eines Dokuments (verschachtelte Aktualisierung)

Lassen Sie uns Frage Nr. 1 in zwei Teile aufteilen. Erhöhen Sie zuerst alle Dokumente, bei denen "items.item_name" gleich "my_item_two" ist. Dazu müssen Sie den Positionsoperator "$" verwenden. Etwas wie:

 db.bar.update( {user_id : 123456 , "items.item_name" : "my_item_two" } , 
                {$inc : {"items.$.price" : 1} } , 
                false , 
                true);

Beachten Sie, dass dadurch nur das erste übereinstimmende Filialdokument in einem beliebigen Array erhöht wird (wenn Sie also ein anderes Dokument im Array haben, bei dem "item_name" gleich "my_item_two" ist, wird es nicht erhöht). Aber das könnte sein, was Sie wollen.

Der zweite Teil ist kniffliger. Wir können ein neues Element ohne "my_item_two" wie folgt in ein Array verschieben:

 db.bar.update( {user_id : 123456, "items.item_name" : {$ne : "my_item_two" }} , 
                {$addToSet : {"items" : {'item_name' : "my_item_two" , 'price' : 1 }} } ,
                false , 
                true);

Für Ihre Frage #2 ist die Antwort einfacher. Um die Summe und den Preis von Artikel_drei in einem beliebigen Dokument zu erhöhen, das "mein_Artikel_drei" enthält, können Sie den $inc-Operator für mehrere Felder gleichzeitig verwenden. Etwas wie:

db.bar.update( {"items.item_name" : {$ne : "my_item_three" }} ,
               {$inc : {total : 1 , "items.$.price" : 1}} ,
               false ,
               true);