【发布时间】:2014-08-19 10:07:54
【问题描述】:
我正在尝试将文档批量插入 MongoDB(因此绕过 Mongoose 并使用本机驱动程序,因为 Mongoose 不支持批量插入文档数组)。我这样做的原因是为了提高写作速度。
我在下面的代码中的 console.log(err) 处收到错误“RangeError: Maximum Call Stack Size Exceeded”:
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]
});
因此,答案是响应中的子文档。虽然不知道如何解决它....
【问题讨论】:
-
可能不相关,但如果
globalSurvey.questions不为空,则会调用两次callback()。在else语句中调用最后一个callback():} else { callback(); }。 -
谢谢 - 是的,同意,但认为这无关......尚未通过插入。
-
我已编辑以解决该问题。
标签: javascript node.js mongodb mongoose