sql >> データベース >  >> NoSQL >> MongoDB

ドキュメントの配列内のオブジェクトをどのように更新しますか(ネストされた更新)

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


    1. $ first in mongodb

    2. 常に埋め込まれたEmberデータのマルチレベル階層

    3. mongoDB関連の問題を効率的に解決するにはどうすればよいですか?

    4. MongoDB:initAndListenの例外:20読み取り専用ディレクトリにロックファイルを作成しようとしました:/ data / db、終了します