1

MongoDB データベースに埋め込まれたドキュメントを多用していますが、データを追加しようとすると速度の問題が発生します。

例として、次のようなドキュメントがあります。

    {
       "date" : <<the date>>
       "name" : "thisName"
       "basket": [
                   {
                     "stock": "IBM",
                     "quantity": 1000.0,
                     "profit"  : 10:0,
                   },
                   ...
                   {
                     "stock": "MSFT",
                     "quantity": 2000.0,
                     "profit"  : 30:0,
                   },

                 ]
}

私がやりたいことは、次のように埋め込みドキュメントに 5 つの新しいフィールドを追加することです。

    {
       "date" : <<the date>>
       "name" : "thisName"
       "basket": [
                   {
                     "stock": "IBM",
                     "quantity": 1000.0,
                     "profit"  : 10:0,
                     "new_1"  : 10:0,
                     "new_2"  : 10:0,
                     "new_3"  : 10:0,
                     "new_4"  : 10:0,
                     "new_4"  : 10:0,
                     "new_5"  : 10:0
                   },
                   ...
                   {
                     "stock": "MSFT",
                     "quantity": 2000.0,
                     "profit"  : 30:0,
                     "new_1"  : 10:0,
                     "new_2"  : 10:0,
                     "new_3"  : 10:0,
                     "new_4"  : 10:0,
                     "new_4"  : 10:0,
                     "new_5"  : 10:0
                   },

                 ]
}

for ループで find().update_one() を使用してこれを開始し、埋め込まれた各ドキュメントを明示的に識別し、「$set」を使用してドキュメントを明示的に使用しました。このアプローチは機能しますが、非常に遅いです。私のコレクションが小さかった場合、これは問題にならないと確信していますが、それは巨大です (数億のドキュメント)。一連のフィールドを追加するたびにドキュメント全体を移動する必要があるため、おそらく非常に遅いでしょう。それを念頭に置いて、すべての埋め込みドキュメントに一度に新しいフィールドを追加しようとしました。これを行うには、検索クエリを空のままにし、「$set」コマンドから位置 $ を削除しました。これに少し似ています(pymongoで):

bulk.find({"date": dates[i],
           "strategyId": strategyInfo[siOffset[l]][ID]
          }).update({
                     "$set": {
                          "basket.new_1": 0.0,
                          "basket.new_2": 0.0,
                          "basket.new_3": 0.0,
                          "basket.new_4": 0.0,
                          "basket.new_5": 0.0
                         }
                      })

このアプローチはエラーをスローするようですcannot use the part (basket of basket.new_5) to traverse the element ({basket:......

私が間違っていることについて誰かが洞察を与えることができますか? これを行うことさえ可能ですか?

4

1 に答える 1

1

このような再帰関数を使用できます。

まず、更新するすべてのデータを見つけます

db.collection('game_users').find(
    {"date": dates[i],"strategyId": strategyInfo[siOffset[l]][ID]}
).toArray(function(err, data) {
    var i=0;
    function data_Update(){
        if(i!=data.length){
            db.collection('game_users').update(
                {"date": dates[i],"strategyId": strategyInfo[siOffset[l]][ID]},
                { $set : {
                    "basket.new_1": 0.0,
                    "basket.new_2": 0.0,
                    "basket.new_3": 0.0,
                    "basket.new_4": 0.0,
                    "basket.new_5": 0.0
                    }
                },
                function(err, resp) {
                    i++;
                    data_Update();
                }
            );
        }
    }
}
);`
于 2016-10-25T10:46:48.173 に答える