所以实际上我创建了一个在文档中插入超过10000条记录的脚本。所以我做了,首先我使用insertMany查询将10000条记录插入到我的集合中。但是,当我再次尝试插入相同数量的记录时,它不会插入到我的文档中。然后我尝试了5000条记录,但这些记录也没有插入。
那么这里有什么问题? MongoDB是否有记录限制?请帮助我。
这是我的剧本:
var resultArr=[];
var getUID = function () {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}
var date = new Date();
date.setDate(date.getDate() + 12);
for(var i=0;i<10000;i++){
resultObj = {
"guid" : (getUID() + getUID() + "-" + getUID() + "-4" + getUID().substr(0, 3) + "-" + getUID()),
title: 'something'
}
resultArr.push(resultObj);
resultObj={};
}
db.getCollection('5891847dc654e8e2150b3bff').insertMany(resultArr, function (err, result) {
print('data saved')
if (err) {
deferred.reject(err)
db.close()
};
});
答案 0 :(得分:0)
请改用以下代码:
var async = require('async');
var resultArr = [];
var getUID = function () {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}
var date = new Date();
date.setDate(date.getDate() + 12);
var count = 0;
async.whilst(
// Check to see if we continue
function() { return count < 10000 },
// The loop function
function(callback) {
count++;
resultArr.push({
"guid" : (getUID() + getUID() + "-" + getUID() + "-4" + getUID().substr(0, 3) + "-" + getUID()),
"title": "something"
});
if ( resultArray.length >= 1000 ) {
db.getCollection('5891847dc654e8e2150b3bff').bulkWrite(
resultArray.map(function(d) {
return { "insertOne": { "document": d } }
}),
function(err,res) {
resultArray = [];
callback(err);
}
);
} else {
callback()
}
},
// This is on completion or error
function(err, n) {
if (err) throw err;
if ( resultArray.length > 0 ) {
db.getCollection('5891847dc654e8e2150b3bff').bulkWrite(
resultArray.map(function(d) { return {
"insertOne": { "document": d }
}),
function(err,res) {
resultArray = [];
db.close();
}
);
} else {
db.close();
}
}
);
这将使用async.whilst
对内部异步调用的流控制拆分循环。这使得callback
可以调用以继续&#34;循环&#34;所以你不要在节点上用同时运行的操作来炸毁调用堆栈。
当数组中的项目数量达到1000时,实际的.bulkWrite()
调用是在循环内部进行的,这是驱动程序一次性发送的最大值。你可以做得更多,但我们正在节省记忆,这是关于&#34;甜蜜的地方&#34;。
在这里使用回调,我们清除数组并调用&#34;循环的回调&#34;为了让循环继续下去。
最后当&#34;循环&#34;完成之后,您通常会检查是否有任何未处理的内容,偶数为1000.在这种情况下,我们知道它是一个圆形数字,但我留下来显示什么与真实的清单有关。
因此该部分位于async.whilst
的最终回调参数中,当循环完成时我们可以实现这个参数,然后我们可以退出。