我正在使用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;
}
}
});
});
答案 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();
});
}
}