ris*_*101 2 mongodb node.js mongodb-query
我必须使用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);
}
});
Run Code Online (Sandbox Code Playgroud)
我面临的问题是mongo的插入限制是16mb,所以我不能一次插入整个数组.请建议最佳解决方案.
主要问题在于请求大小而不是文档大小,但它也是相同的限制.批量操作和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");
}
);
Run Code Online (Sandbox Code Playgroud)
我应该注意,无论批量操作是否存在内部限制,每批操作1000次.您可以提交更大的尺寸,但司机只是打破这些并仍然分批提交1000.
1000是一个很好的数字,因为它已经符合处理请求的方式,以及在排空请求队列和发送到服务器之前保留在内存中的合理数量的事情.