U otázky č. 1 ji rozdělme na dvě části. Nejprve zvyšte každý dokument, který má "items.item_name" rovný "my_item_dwo". K tomu budete muset použít poziční operátor "$". Něco jako:
db.bar.update( {user_id : 123456 , "items.item_name" : "my_item_two" } ,
{$inc : {"items.$.price" : 1} } ,
false ,
true);
Všimněte si, že to zvýší pouze první odpovídající vnořený dokument v libovolném poli (takže pokud máte v poli jiný dokument s "item_name" rovným "my_item_two", nezvýší se). Ale může to být to, co chcete.
Druhá část je složitější. Novou položku můžeme vložit do pole bez "my_item_two" následovně:
db.bar.update( {user_id : 123456, "items.item_name" : {$ne : "my_item_two" }} ,
{$addToSet : {"items" : {'item_name' : "my_item_two" , 'price' : 1 }} } ,
false ,
true);
Na vaši otázku č. 2 je odpověď jednodušší. Chcete-li zvýšit celkovou částku a cenu položky item_three v libovolném dokumentu, který obsahuje „my_item_three“, můžete použít operátor $inc na více polích současně. Něco jako:
db.bar.update( {"items.item_name" : {$ne : "my_item_three" }} ,
{$inc : {total : 1 , "items.$.price" : 1}} ,
false ,
true);