用Node.js插入多条logging到Mongodb的正确方法

我想知道使用Node.js进行Mongodb批量插入的正确方法是什么(尽pipe可能是任何其他数据库)

我已经写了下面的代码作为例子,但我相信这是因为db.close()可能会在所有asynchronouscollection.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(); }); 

如果你的MongoDB服务器是2.6或者更新的话,最好是利用一个写命令批量API批量执行批量插入操作,这些批量插入操作只是简单的抽象到服务器上,以便于构build批量操作从而获得更大的collections与性能收益。

批量发送批量插入操作会减less服务器的stream量,因此不会将所有内容都发送到单个语句中,而是将其分解为可pipe理的块,以实现服务器承诺。 采用这种方法等待callback中的响应的时间也更less。

这些批量操作主要有两种:

  • 有序批量操作 。 这些操作按顺序执行所有操作,并在第一次写入错误时出错。
  • 无序的批量操作 。 这些操作并行地执行所有操作并聚合所有的错误。 无序批量操作不保证执行顺序。

请注意,对于比2.6更旧的服务器,API将下载转换操作。 但是,无法将其下变换为100%,因此可能会出现一些无法正确报告正确数字的边缘情况。

在你的情况下,你可以批量执行批量API插入操作,如下所示:

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

你可以使用insertMany 。 它接受一个对象数组。 检查API 。

3.2版本的新function

db.collection.bulkWrite()方法提供了执行批量插入,更新和删除操作的function。 MongoDB也支持通过db.collection.insertMany()进行批量插入。

在bulkWrite它只支持insertOne,updateOne,updateMany,replaceOne,deleteOne,deleteMany

在你的情况下,使用单行代码插入数据,它可以使用insertMany选项。

  MongoClient.connect('mongodb://127.0.0.1:27017/test', function (err, db) { var i, collection; if (err) { throw err; } collection = db.collection('entries'); collection.insertMany(entries) db.close(); }); 
 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(); });