如何迭代mongodb中的100多个项目

时间:2016-08-05 02:09:57

标签: node.js mongodb express

我正在使用express和mongodb npm模块将数据插入到包含1300多个收集项的集合中。我从json文件中提取数据,该文件也有1300多个对象。使用以下代码,一切都被正确插入,直到我在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 个答案:

答案 0 :(得分:1)

最好在此处使用 bulkWrite API,这样可以大大提高性能,因为写入操作只会批量发送到服务器一次。效率得以实现,因为该方法不会向服务器发送每个写入请求(与 forEach() 循环中的当前更新语句一样),而是每1000个请求中只发送一次,从而使更新更多比现在更有效,更快:

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