2016-08-05 31 views
0

私はexpressとmongodb npmモジュールを使用して、コレクションアイテムが1300を超えるコレクションにデータを挿入しています。 1300を超えるオブジェクトを持つjsonファイルからデータを抽出しています。次のコードでは、mongodbコレクション内の100項目に達するまで、すべてが正しく挿入されます。これを回避して複数のコレクションに分割する方法はありますか?mongodbで100以上のアイテムを反復する方法

私は、ノードに次のコードを使用しています:

MongoClient.connect(url, function(err, db) { 
    db.collection('players').find().forEach(function(myDoc) { 
    for(var i = 0; i < jsonfile.length; i++) { 
     if (myDoc.player_ID == jsonfile[i].playerID && myDoc.stint_ID == 1) { 
     db.collection('players').updateOne(
      { 'player_ID' : jsonfile[i].playerID}, 
      { $set: { 
      'strikeOut' : jsonfile[i].SO } 
      }, function(err, result) { 
      console.log(err); 
      db.close(); 
      } 
     ); 
     } else { 
     return; 
     } 
    } 
    }); 
}); 

答えて

1

書き込み操作が一度だけ大量にサーバーに送信されるため、パフォーマンスを大幅に向上させ、ここでbulkWrite APIを使用するのがベスト。この方法では、(現在の更新ステートメントがforEach()ループ内のように)サーバーにすべての書き込み要求を送信するのではなく、1000リクエストごとに1回だけ送信されるため、効率が向上し、現在よりも効率的で迅速な更新が行われます。

var MongoClient = require('mongodb').MongoClient, 
    bulkUpdateOps = []; 

MongoClient.connect(url, function(err, db) { 
    // Get the collection 
    var col = db.collection('players'); 
    col.find().forEach(function(myDoc) { 
     for(var i = 0; i < jsonfile.length; i++) { 
      if (myDoc.player_ID == jsonfile[i].playerID && myDoc.stint_ID == 1) { 
       bulkUpdateOps.push({ 
        "updateOne": { 
         "filter": { "player_ID": jsonfile[i].playerID }, 
         "update": { "$set": { "strikeOut" : jsonfile[i].SO } } 
        } 
       });  
       if (bulkUpdateOps.length === 1000) { 
        col.bulkWrite(bulkUpdateOps).then(function(r) { 
         // do something with the result 
         console.log(r); 
        }); 
        bulkUpdateOps = []; 
       } 
      } 
     } 
    });   

    if (bulkUpdateOps.length > 0) { 
     col.bulkWrite(bulkUpdateOps).then(function(r) { 
      console.log(r); 
      db.close(); 
     }); 
    } 
} 
関連する問題