W przypadku pytania nr 1 podzielmy je na dwie części. Najpierw zwiększ każdy dokument, który ma „items.item_name” równy „my_item_two”. W tym celu będziesz musiał użyć operatora pozycyjnego „$”. Coś takiego:
db.bar.update( {user_id : 123456 , "items.item_name" : "my_item_two" } ,
{$inc : {"items.$.price" : 1} } ,
false ,
true);
Zauważ, że spowoduje to zwiększenie tylko pierwszego dopasowanego dokumentu podrzędnego w dowolnej tablicy (więc jeśli masz inny dokument w tablicy z „nazwa_elementu” równą „mój_element_dwa”, nie zostanie on zwiększony). Ale może to być to, czego chcesz.
Druga część jest trudniejsza. Możemy wepchnąć nowy element do tablicy bez „my_item_two” w następujący sposób:
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 twoje pytanie nr 2 odpowiedź jest łatwiejsza. Aby zwiększyć sumę i cenę item_three w dowolnym dokumencie, który zawiera „my_item_three”, możesz użyć operatora $inc na wielu polach jednocześnie. Coś takiego:
db.bar.update( {"items.item_name" : {$ne : "my_item_three" }} ,
{$inc : {total : 1 , "items.$.price" : 1}} ,
false ,
true);