问题在创建另一个集合从一个mongodb查询的结果在节点
Issue in creating another collection from result of a mongodb query in node
我试图使用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) {});
}
});
});
});
})
<<p> 控制台样本/strong> 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]
我哪里做错了?
这失败的原因是因为当你插入你的文档值是一个数组,你报告的"长度"。
虽然文档的数组可以发送给插入,但问题不是"单个"文档的大小,而是整个插入。所以你打破了最大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) 。
相关文章:
- 使用mongodb更新中的一个变量
- 为什么我从一个空的mongodb数据库中获取数据
- 为什么我会得到一个“;auth失败”;使用正确的凭据连接到MongoDB时出错
- MongoDB聚合将两个不同的字段合并为一个并获取计数
- 两个服务器可以访问一个公共的mongoDB数据库吗?
- 如何在MongoDB对象的每个嵌套数组中添加一个额外的元素
- 将文档的MongoDB字段合并到一个文档中
- 在document-mongoDB中设置一个字段
- 如何计算mongodb中两个集合中一个字段的不同值的数量
- 将一个小型javascript表达式转换为mongodb查询
- MongoDB map/reduce,forEach不是一个函数
- setTimeout与mongodb各一个
- 对于用NodeJS编写的递归MongoDB归档程序来说,这是一个好的架构吗
- MongoDB:如何调用另一个JS文件中定义的函数
- 如何从MongoDB中选择所有文档,其中一个字段不等于某个值
- Meteor - 将 mongodb 查询分配给变量并将其插入到另一个集合
- MongoDB - 查找元素,其中字段等于数组中的至少一个值
- MongoDB:按日历周和年聚合文档,并计算一个字段的所有值的总量
- 基于 MongoDB 中另一个集合中的数据查询一个集合中的数据
- MongoDB从一组未知子文档中的每一个$slice