我试图使用nodejs
在mongodb中创建另一个带有查询结果的集合如果我只有少量记录,代码工作正常。但如果有大量记录,则无法正常工作。
错误
[Error: Document exceeds maximum allowed bson size of 16777216 bytes]
代码
MongoClient.connect(MONGODB_URI, function (err, database) {
if (err) throw err;
coll = database.collection("smmc_queue");
coll.insert({
"startTime": moment().format("DD-MM-YYYY, h:mm:ss a"),
"caseName": req.body.caseName,
"author": req.session.user,
"jobType": 'Query',
"status": 'In progress',
"searchDescription": searchDescription,
"query": searchCondition,
"sort": sortCondition
}, function (err, sucessDoc) {
res.redirect(302, '/queryStatus');
MongoClient.connect(MONGODB_URI, function (err, database) {
if (err) throw err;
collection = database.collection(req.body.caseName);
collection.find(searchObj, sortObj).toArray(function (err, doc) {
var ncn = 'query_' + sucessDoc[0]._id.toString();
if (!err) {
coll.update({
"_id": sucessDoc[0]._id
}, {
$set: {
"endTime": moment().format("DD-MM-YYYY, h:mm:ss a"),
status: "Completed",
}
}, {
upsert: true,
multi: true
}, function (err, result) {});
resultCollection = database.collection(ncn);
console.log(typeof doc)
console.log(doc.length)
resultCollection.insert(doc, function (err, res) {
console.log(err);
});
} else {
coll.update({
"_id": sucessDoc[0]._id
}, {
$set: {
"endTime": moment().format("DD-MM-YYYY, h:mm:ss a"),
status: "Completed",
"result": err
}
}, {
upsert: true,
multi: true
}, function (err, result) {});
}
});
});
});
})
控制台示例
Search Query : { CARDNO: 821 }
typeof doc : object
doc.length : 756
err (insert to resultCollection) : null
Search Query : { IODATE: { '$gt': Mon Apr 02 2012 00:00:00 GMT+0530 (IST) } }
typeof doc : object
doc.length : 374010
err (insert to resultCollection) : [Error: Document exceeds maximum allowed bson size of 16777216 bytes]
我哪里出错了?
答案 0 :(得分:5)
失败的原因是因为当您插入时,您的doc值是一个数组,其长度为" length"你正在报道。
虽然可以插入数组文件,但不是"个人"文档大小有问题,但整个插入。所以你打破了最大的BSON大小,因为"请求"插入大于最大值(16MB)。
需要要做的就是解决这个问题,一次尝试500
的数量。
var last = 0;
for ( var i=0; i < doc.length; i+= 500 ) {
resultCollection.insert( doc.slice(last, i) );
last = i;
}
resultCollection.insert( doc.slice(last, doc.length) );
或者可能比那更好的东西。
但一般来说,打破阵列。您只能按照请求执行限制(16MB)。