我正在尝试将文档批量插入 MongoDB(因此绕过 Mongoose 并使用本机驱动程序代替,因为 Mongoose 不支持批量插入文档数组)。我这样做的原因是为了提高写作速度。
我在以下代码的 console.log(err) 收到错误“RangeError:超出最大调用堆栈大小”:
function _fillResponses(globalSurvey, optionsToSelectRegular, optionsToSelectPiped, responseIds, callback) {
Response.find({'_id': {$in: responseIds}}).exec(function(err, responses) {
if (err) { return callback(err); }
if (globalSurvey.questions.length) {
responses.forEach(function(response) {
console.log("Filling response: " + response._id);
response.answers = [];
globalAnswers = {};
globalSurvey.questions.forEach(function(question) {
ans = _getAnswer(question, optionsToSelectRegular, optionsToSelectPiped, response);
globalAnswers[question._id] = ans;
response.answers.push(ans);
});
});
Response.collection.insert(responses, function(err, responsesResult) {
console.log(err);
callback()
});
} else {
callback();
}
});
}
如此类似于: https ://stackoverflow.com/questions/24356859/mongoose-maximum-call-stack-size-exceeded
也许是关于 Mongoose 返回的响应数组格式的问题,这意味着我不能直接使用 MongoDB 本机插入?我在每个响应上都尝试了 .toJSON() 但没有成功。
即使数据量非常小,我仍然会收到错误消息,但循环遍历并在每个文档上调用 Mongoose 保存都可以正常工作。
编辑:我认为这与这个问题有关:http: //howtosjava.blogspot.com.au/2012/05/nodejs-mongoose-rangeerror-maximum-call.html
我的响应模式是:
var ResponseSchema = new Schema({
user: {
type: Schema.ObjectId,
ref: 'User'
},
randomUUID: String,
status: String,
submitted: Date,
initialEmailId: String,
survey: String,
answers: [AnswerSchema]
});
因此,答案是响应中的子文档。不知道如何解决它……
原文由 Andrew 发布,翻译遵循 CC BY-SA 4.0 许可协议
我遇到了同样的问题,于是我开始研究 mongoose 源代码(3.8.14 版)。最终它把我带到了这条线
var bsonSize = bson.calculateObjectSize(document, false);
显然,这调用了 BSON.calculateObjectSize,它调用了 calculateObjectSize,然后无限递归。我无法深入了解导致它的原因,但认为它可能与模式的 mongoose 包装器绑定函数有关。由于我将原始数据插入到 mongoDB 中,一旦我决定将 mongoose 中的批量插入更改为标准的 javascript 对象,问题就消失了,并且批量插入正确发生了。您也许可以做类似的事情。
本质上,我的代码来自
至