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);