sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo se actualizan los objetos en la matriz de un documento (actualización anidada)?

Para la pregunta #1, dividámosla en dos partes. Primero, incremente cualquier documento que tenga "items.item_name" igual a "my_item_two". Para esto tendrás que usar el operador posicional "$". Algo como:

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

Tenga en cuenta que esto solo incrementará el primer subdocumento coincidente en cualquier matriz (por lo que si tiene otro documento en la matriz con "item_name" igual a "my_item_two", no se incrementará). Pero esto podría ser lo que quieres.

La segunda parte es más complicada. Podemos enviar un elemento nuevo a una matriz sin "my_item_two" de la siguiente manera:

 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 su pregunta #2, la respuesta es más fácil. Para incrementar el total y el precio de artículo_tres en cualquier documento que contenga "mi_artículo_tres", puede usar el operador $inc en varios campos al mismo tiempo. Algo como:

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