gpt4 book ai didi

node.js - 如何使用 NodeJS 向 mongodb 执行批量插入

转载 作者:可可西里 更新时间:2023-11-01 09:57:53 25 4
gpt4 key购买 nike

我必须使用 nodejs 在 mongodb 中插入大约 10,00000 个文档。

我使用 for 循环生成这些文档,将它们存储到一个数组中,然后最终将它们插入到 mongodb 中。

var codeArray = new Array();
for (var i = 0; i<1000000; i++){
var token = strNpm.generate();
var now = moment().format('YYYYMMDD hhmmss');
var doc1 = {id:token,
Discount_strId:"pending",
Promotion_strCode:token,
Promotion_strStatus:"I",
Promotion_dtmGeneratedDate:now,
User_strLogin:"test",
Promotion_strMode:"S",
Promotion_dtmValidFrom:"pending",
Promotion_dtmValidTill:"pending",
LastModified_dtmStamp:now
};
codeArray.push(doc1);
db.collection('ClPromoCodeMaster').insert(codeArray, function (err, result) {
if (err){
console.log(err);
}else{
console.log('Inserted Records - ', result.ops.length);
}
});

我面临的问题是 mongo 的插入限制为 16mb,因此我无法一次插入整个数组。请提出最优化的解决方案。

最佳答案

主要问题在于请求大小而不是文档大小,但它们具有相同的限制。 Bulk operations和带有 async.whilst 的异步库将处理这个:

var bulk = db.collection('ClPromoCodeMaster').initializeOrderedBulkOp(),
i = 0;

async.whilst(
function() { return i < 1000000; },
function(callback) {
var token = strNpm.generate();
var now = moment().format('YYYYMMDD hhmmss');
var doc = {
id:token,
Discount_strId:"pending",
Promotion_strCode:token,
Promotion_strStatus:"I",
Promotion_dtmGeneratedDate:now,
User_strLogin:"test",
Promotion_strMode:"S",
Promotion_dtmValidFrom:"pending",
Promotion_dtmValidTill:"pending",
LastModified_dtmStamp:now
};

bulk.insert(doc);
i++;

// Drain every 1000
if ( i % 1000 == 0 ) {
bulk.execute(function(err,response){
bulk = db.collection('ClPromoCodeMaster').initializeOrderedBulkOp();
callback(err);
});
} else {
callback();
}

},
function(err) {
if (err) throw err;
console.log("done");
}
);

我应该注意,无论批量操作是否存在内部限制,每批处理操作不得超过 1000 次。您可以提交更大的尺寸,但驱动程序只是将它们分解并仍然以 1000 个为一组提交。

虽然 1000 是一个很好的数字,因为它已经符合请求的处理方式,并且在清空请求队列并发送到服务器。

关于node.js - 如何使用 NodeJS 向 mongodb 执行批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32049227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com