For spørgsmål #1, lad os dele det op i to dele. Forøg først ethvert dokument, der har "items.item_name" lig med "my_item_two". Til dette skal du bruge den positionelle "$"-operator. Noget som:
db.bar.update( {user_id : 123456 , "items.item_name" : "my_item_two" } ,
{$inc : {"items.$.price" : 1} } ,
false ,
true);
Bemærk, at dette kun vil øge det første matchede underdokument i et hvilket som helst array (så hvis du har et andet dokument i arrayet med "item_name" lig med "my_item_two", bliver det ikke inkrementeret). Men det er måske det, du ønsker.
Anden del er sværere. Vi kan skubbe et nyt element til et array uden "my_item_two" som følger:
db.bar.update( {user_id : 123456, "items.item_name" : {$ne : "my_item_two" }} ,
{$addToSet : {"items" : {'item_name' : "my_item_two" , 'price' : 1 }} } ,
false ,
true);
For dit spørgsmål #2 er svaret nemmere. For at øge totalen og prisen på item_three i ethvert dokument, der indeholder "my_item_three", kan du bruge $inc-operatoren på flere felter på samme tid. Noget som:
db.bar.update( {"items.item_name" : {$ne : "my_item_three" }} ,
{$inc : {total : 1 , "items.$.price" : 1}} ,
false ,
true);