如果您的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 objectsvar 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 <3.2
var MongoClient = require('mongodb').MongoClient;var url = 'mongodb://localhost:27017/test';var entries = [ ... ] // a huge array containing the entry objectsvar 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(); });});
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)