För fråga #1, låt oss dela upp den i två delar. Öka först alla dokument som har "items.item_name" lika med "my_item_two". För detta måste du använda positionsoperatorn "$". Något i stil med:
db.bar.update( {user_id : 123456 , "items.item_name" : "my_item_two" } ,
{$inc : {"items.$.price" : 1} } ,
false ,
true);
Observera att detta endast kommer att öka det första matchade underdokumentet i någon array (så om du har ett annat dokument i arrayen med "item_name" lika med "my_item_two", kommer det inte att ökas). Men det här kanske du vill ha.
Den andra delen är knepigare. Vi kan skicka ett nytt objekt till en array utan "my_item_two" enligt följande:
db.bar.update( {user_id : 123456, "items.item_name" : {$ne : "my_item_two" }} ,
{$addToSet : {"items" : {'item_name' : "my_item_two" , 'price' : 1 }} } ,
false ,
true);
För din fråga #2 är svaret enklare. För att öka summan och priset för artikel_tre i alla dokument som innehåller "min_artikel_tre" kan du använda operatorn $inc på flera fält samtidigt. Något i stil med:
db.bar.update( {"items.item_name" : {$ne : "my_item_three" }} ,
{$inc : {total : 1 , "items.$.price" : 1}} ,
false ,
true);