我需要从nodejs在mongodb中插入一大堆对象(大约1.5-2百万)。我怎样才能改善插入?
这是我的代码:
var sizeOfArray = arrayOfObjects.length; //sizeOfArray about 1.5-2 millions
for(var i = 0; i < sizeOfResult; ++i) {
newKey = {
field_1: result[i][1],
field_2: result[i][2],
field_3: result[i][3]
};
collection.insert(newKey, function(err, data) {
if (err) {
log.error('Error insert: ' + err);
}
});
}
答案 0 :(得分:16)
您可以使用bulk插页。
有两种类型的批量操作:
- 订购批量操作。这些操作按顺序执行所有操作,并在第一次写入错误时执行错误。
- 无序批量操作。这些操作并行执行所有操作并聚合所有错误。无序 批量操作不保证执行顺序。
醇>
所以你可以这样做:
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect("mongodb://myserver:27017/test", function(err, db) {
// Get the collection
var col = db.collection('myColl');
// Initialize the Ordered Batch
// You can use initializeUnorderedBulkOp to initialize Unordered Batch
var batch = col.initializeOrderedBulkOp();
for (var i = 0; i < sizeOfResult; ++i) {
var newKey = {
field_1: result[i][1],
field_2: result[i][2],
field_3: result[i][3]
};
batch.insert(newKey);
}
// Execute the operations
batch.execute(function(err, result) {
console.dir(err);
console.dir(result);
db.close();
});
});
答案 1 :(得分:1)
对于版本> 3.2,引入了 insertMany ,其在引擎盖下使用 bulkWrite 仅用于批量插入。
插入许多支持有序和无序插入。 无序是mongo决定排序的更快方法。同样,实现最佳吞吐量的实现应为::
var sizeOfArray = arrayOfObjects.length;
for(var i = 0; i < sizeOfResult; ++i) {
newKey = {
field_1: result[i][1],
field_2: result[i][2],
field_3: result[i][3]
};
}
collection.insertMany(newKey, { ordered: false }).then((res) => {
console.log("Number of records inserted: " + res.insertedCount);
})