我试图将文档批量插入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(); } }); }
也许与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] });
因此,答案是响应中的子文档。不知道如何解决它…。
我遇到了同样的问题,我开始研究猫鼬的源代码(版本3.8.14)。最终它引导我进入了这条线
var bsonSize = bson.calculateObjectSize(document,false);
显然,这调用了BSON.calculateObjectSize,后者调用了calculateObjectSize,然后无限递归。我无法深入探究导致它的原因,但发现它可能与将猫鼬包装器绑定到Schema的功能有关。由于我将原始数据插入到mongoDB中,因此,一旦我决定将mongoose中的批量插入更改为标准javascript对象,问题就消失了,批量插入正确地发生了。您可能可以执行类似的操作。
本质上,我的代码来自
//EDIT: mongoose.model needs lowercase 'm' for getter method var myModel = mongoose.model('MyCollection'); var toInsert = myModel(); var array = [toInsert]; myModel.collection.insert(array, {}, function(err, docs) {});
至
//EDIT: mongoose.model needs lowercase 'm' for getter method var myModel = mongoose.model('MyCollection'); var toInsert = { //stuff in here name: 'john', date: new Date() }; var array = [toInsert]; myModel.collection.insert(array, {}, function(err, docs) {});