MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment mettre à jour les objets dans le tableau d'un document (mise à jour imbriquée)

Pour la question #1, divisons-la en deux parties. Tout d'abord, incrémentez tout document dont "items.item_name" est égal à "my_item_two". Pour cela, vous devrez utiliser l'opérateur positionnel "$". Quelque chose comme :

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

Notez que cela n'incrémentera que le premier sous-document correspondant dans n'importe quel tableau (donc si vous avez un autre document dans le tableau avec "item_name" égal à "my_item_two", il ne sera pas incrémenté). Mais c'est peut-être ce que vous voulez.

La deuxième partie est plus délicate. Nous pouvons pousser un nouvel élément vers un tableau sans "my_item_two" comme suit :

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

Pour votre question #2, la réponse est plus simple. Pour incrémenter le total et le prix de item_three dans tout document contenant "my_item_three", vous pouvez utiliser l'opérateur $inc sur plusieurs champs en même temps. Quelque chose comme :

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