Javascript 根据节点中mongodb查询的结果创建另一个集合时出现问题

Javascript 根据节点中mongodb查询的结果创建另一个集合时出现问题,javascript,node.js,mongodb,mongodb-query,Javascript,Node.js,Mongodb,Mongodb Query,我试图使用nodejs在mongodb中创建另一个集合,该集合具有查询结果 如果我只有几条记录,代码就可以正常工作。但如果有大量记录,则不起作用 错误 [Error: Document exceeds maximum allowed bson size of 16777216 bytes] 代码 MongoClient.connect(MONGODB_URI, function (err, database) { if (err) throw err; coll = datab

我试图使用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]

我哪里出错了?

失败的原因是,当您插入时,您的文档值是一个数组,包含您报告的“长度”

虽然可以发布文档的数组来插入,但问题不是“单个”文档大小,而是整个插入。因此,您正在破坏最大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) );
var last=0;
对于(变量i=0;i
或者比这更好的东西


但一般来说,分解数组。您只能对每个请求执行限制(16MB)

如果我使用async each或其他什么,它会工作吗?还是有其他方法可以将其拆分?@SreekeshOkky您仍然需要以某种方式迭代结果。虽然和数组是有效的,但您要发送的是大的。我已经包含了一些基本代码作为示例。我使用了async eachSeries。工作正常。非常感谢你在右边引导我path@SreekeshOkky正如我所说,有更好的。但只要它被打破。可以考虑迭代光标,而不是使用
.toArray()
来节省内存。