MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como você atualiza objetos na matriz de um documento (atualização aninhada)


Para a pergunta nº 1, vamos dividi-la em duas partes. Primeiro, incremente qualquer documento que tenha "items.item_name" igual a "my_item_two". Para isso, você terá que usar o operador posicional "$". Algo como:
 db.bar.update( {user_id : 123456 , "items.item_name" : "my_item_two" } , 
                {$inc : {"items.$.price" : 1} } , 
                false , 
                true);

Observe que isso apenas incrementará o primeiro subdocumento correspondente em qualquer matriz (portanto, se você tiver outro documento na matriz com "item_name" igual a "my_item_two", ele não será incrementado). Mas isso pode ser o que você quer.

A segunda parte é mais complicada. Podemos enviar um novo item para um array sem um "my_item_two" da seguinte forma:
 db.bar.update( {user_id : 123456, "items.item_name" : {$ne : "my_item_two" }} , 
                {$addToSet : {"items" : {'item_name' : "my_item_two" , 'price' : 1 }} } ,
                false , 
                true);

Para sua pergunta nº 2, a resposta é mais fácil. Para incrementar o total e o preço de item_three em qualquer documento que contenha "my_item_three", você pode usar o operador $inc em vários campos ao mesmo tempo. Algo como:
db.bar.update( {"items.item_name" : {$ne : "my_item_three" }} ,
               {$inc : {total : 1 , "items.$.price" : 1}} ,
               false ,
               true);