2016-10-25 27 views
1

に追加フィールドの追加:は私が私のMongoDBデータベースに埋め込まれた文書の広範囲に使用すると、追加データを追加しようとしたとき、私はスピードの問題に実行している埋め込まれた文書

私はAに見える文書を持っている例として、このようなビットは:

{ 
     "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 
        }, 

       ] 
} 

が、私はこの使用して検索を始め( ).update_one()forループでは、埋め込まれた各ドキュメントを明示的に識別し、ドキュメントを明示的に "$ set"を使用して使用します。このアプローチは機能しますが、非常に遅いです。私のコレクションが小さかった場合は、これは問題ではないと確信していますが、それは膨大なものです(何百万ものドキュメントの100)。フィールドのセットを追加するたびにドキュメント全体を移動する必要があるため、おそらく非常に遅いです。そのことを念頭に置いて、すべての埋め込みドキュメントに新しいフィールドを追加しようとしました。これは、検索クエリを空のままにして、 "$ 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:......

がするなど、いくつかの洞察を与えることができる誰も私が間違ってやっているされたエラーを投げているようですか?これも可能ですか?

+0

可能重複[MongoDBの中の複数の配列要素を更新する方法](http://stackoverflow.com/questions/4669178/how-to-update-multiple更新のためにすべてのデータを検索します-array-elements-in-mongodb) –

+0

MongoDBは重複している可能性はあるものの、2011年以降大幅に変更されていることに同意します。 –

答えて

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(); 
       } 
      ); 
     } 
    } 
} 
);` 
+0

このアプローチは私が使用している方法よりも速くなります。ループを実行する別の方法ではありませんか?そのようなサーバーは1つのサブ文書を更新するたびに文書全体を移動しますか? –

+0

古いユーザーがあなたのアプリにサインアップしたときに、このフィールドをチェックすると、このフィールドがユーザープロファイルにない場合は追加できます。 –

関連する問題