質問1については、2つの部分に分けてみましょう。まず、「items.item_name」が「my_item_two」に等しいドキュメントをインクリメントします。このためには、位置「$」演算子を使用する必要があります。次のようなもの:
db.bar.update( {user_id : 123456 , "items.item_name" : "my_item_two" } ,
{$inc : {"items.$.price" : 1} } ,
false ,
true);
これは、任意の配列で最初に一致したサブドキュメントのみをインクリメントすることに注意してください(したがって、「item_name」が「my_item_two」に等しい配列に別のドキュメントがある場合、インクリメントされません)。しかし、これはあなたが望むものかもしれません。
2番目の部分はトリッキーです。次のように、「my_item_two」なしで新しいアイテムを配列にプッシュできます。
db.bar.update( {user_id : 123456, "items.item_name" : {$ne : "my_item_two" }} ,
{$addToSet : {"items" : {'item_name' : "my_item_two" , 'price' : 1 }} } ,
false ,
true);
あなたの質問#2については、答えは簡単です。 「my_item_three」を含むドキュメントのitem_threeの合計と価格を増やすには、複数のフィールドで同時に$inc演算子を使用できます。次のようなもの:
db.bar.update( {"items.item_name" : {$ne : "my_item_three" }} ,
{$inc : {total : 1 , "items.$.price" : 1}} ,
false ,
true);