sql >> Database >  >> NoSQL >> MongoDB

Hoe werk je objecten in de array van een document bij (geneste updates)

Laten we vraag 1 in twee delen opsplitsen. Verhoog eerst elk document dat "items.item_name" gelijk heeft aan "my_item_two". Hiervoor moet u de positionele "$"-operator gebruiken. Iets als:

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

Merk op dat dit alleen het eerste overeenkomende subdocument in een array zal verhogen (dus als je een ander document in de array hebt met "item_name" gelijk aan "my_item_two", wordt het niet verhoogd). Maar dit is misschien wat je wilt.

Het tweede deel is lastiger. We kunnen een nieuw item als volgt naar een array pushen zonder "my_item_two":

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

Voor uw vraag #2 is het antwoord eenvoudiger. Om het totaal en de prijs van item_three te verhogen in een document dat "my_item_three" bevat, kunt u de $inc-operator op meerdere velden tegelijk gebruiken. Iets als:

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


  1. Datum-gegevenstype importeren met mongoimport

  2. MongoDB - Toestemming geweigerd voor socket:/tmp/mongodb-27017.sock

  3. Enkele kleine (minder dan 1 MB) bestanden opslaan met MongoDB in NodeJS ZONDER GridFS

  4. Kan geen Jedis-verbinding krijgen bij gebruik van SSL met Redis en Spring Data Redis