我想知道使用Node.js批量插入Mongodb(尽管可能是任何其他数据库)的正确方法是什么
我已经编写了以下代码作为示例,尽管我认为它已经解决,因为db.close()可能在所有异步collection.insert调用完成之前运行。
MongoClient.connect('mongodb://127.0.0.1:27017/test', function (err, db) {
var i, collection;
if (err) {
throw err;
}
collection = db.collection('entries');
for (i = 0; i < entries.length; i++) {
collection.insert(entries[i].entry);
}
db.close();
});
答案 0 :(得分:15)
如果您的MongoDB服务器是2.6或更高版本,最好利用写入命令 Bulk API 来执行批量插入操作,这些操作只是简单的抽象操作服务器的顶部,可以轻松构建批量操作,从而通过大型集合的更新获得性能提升。
批量发送批量插入操作会减少到服务器的流量,从而通过不在单个语句中发送所有内容来执行高效的有线事务,而是分解为服务器承诺的可管理块。使用这种方法在回调中等待响应的时间也更少。
这些批量操作主要有两种形式:
注意,对于比2.6更旧的服务器,API将下转换操作。但是,不可能将100%下变频,因此可能存在一些无法正确报告正确数字的边缘情况。
在您的情况下,您可以批量实现批量API插入操作,如下所示:
对于MongoDB 3.2 + ,使用 bulkWrite
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
var entries = [ ... ] // a huge array containing the entry objects
var createNewEntries = function(db, entries, callback) {
// Get the collection and bulk api artefacts
var collection = db.collection('entries'),
bulkUpdateOps = [];
entries.forEach(function(doc) {
bulkUpdateOps.push({ "insertOne": { "document": doc } });
if (bulkUpdateOps.length === 1000) {
collection.bulkWrite(bulkUpdateOps).then(function(r) {
// do something with result
});
bulkUpdateOps = [];
}
})
if (bulkUpdateOps.length > 0) {
collection.bulkWrite(bulkUpdateOps).then(function(r) {
// do something with result
});
}
};
对于MongoDB&lt; 3.2
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
var entries = [ ... ] // a huge array containing the entry objects
var createNewEntries = function(db, entries, callback) {
// Get the collection and bulk api artefacts
var collection = db.collection('entries'),
bulk = collection.initializeOrderedBulkOp(), // Initialize the Ordered Batch
counter = 0;
// Execute the forEach method, triggers for each entry in the array
entries.forEach(function(obj) {
bulk.insert(obj);
counter++;
if (counter % 1000 == 0 ) {
// Execute the operation
bulk.execute(function(err, result) {
// re-initialise batch operation
bulk = collection.initializeOrderedBulkOp();
callback();
});
}
});
if (counter % 1000 != 0 ){
bulk.execute(function(err, result) {
// do something with result
callback();
});
}
};
调用 createNewEntries()
函数。
MongoClient.connect(url, function(err, db) {
createNewEntries(db, entries, function() {
db.close();
});
});
答案 1 :(得分:5)
您可以使用insertMany
。它接受一组对象。查看API。
答案 2 :(得分:1)
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
var data1={
name:'Data1',
work:'student',
No:4355453,
Date_of_birth:new Date(1996,10,17)
};
var data2={
name:'Data2',
work:'student',
No:4355453,
Date_of_birth:new Date(1996,10,17)
};
MongoClient.connect(url, function(err, db) {
if(err!=null){
return console.log(err.message)
}
//insertOne
db.collection("App").insertOne(data1,function (err,data) {
if(err!=null){
return console.log(err);
}
console.log(data.ops[0]);
});
//insertMany
var Data=[data1,data2];
db.collection("App").insertMany(Data,forceServerObjectId=true,function (err,data) {
if(err!=null){
return console.log(err);
}
console.log(data.ops);
});
db.close();
});
答案 3 :(得分:1)
3.2版中的新功能。
db.collection.bulkWrite()方法提供了执行批量插入,更新和删除操作的功能。 MongoDB还支持通过db.collection.insertMany()批量插入。
在bulkWrite中,它只支持insertOne,updateOne,updateMany,replaceOne,deleteOne,deleteMany
在您使用单行代码插入数据的情况下,它可以使用insertMany选项。
the last character
&#13;