MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come si aggiornano gli oggetti nell'array di un documento (aggiornamento nidificato)

Per la domanda n. 1, suddividiamola in due parti. Innanzitutto, incrementa qualsiasi documento che abbia "items.item_name" uguale a "my_item_two". Per questo dovrai usare l'operatore posizionale "$". Qualcosa come:

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

Nota che questo incrementerà solo il primo documento secondario corrispondente in qualsiasi array (quindi se hai un altro documento nell'array con "nome_oggetto" uguale a "mio_elemento_due", non verrà incrementato). Ma questo potrebbe essere quello che vuoi.

La seconda parte è più complicata. Possiamo eseguire il push di un nuovo elemento in un array senza "my_item_two" come segue:

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

Per la tua domanda n. 2, la risposta è più semplice. Per incrementare il totale e il prezzo di item_three in qualsiasi documento che contiene "my_item_three", puoi utilizzare l'operatore $inc su più campi contemporaneamente. Qualcosa come:

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