Tôi đang cố chèn hàng loạt tài liệu vào MongoDB (vì vậy bỏ qua Mongoose và sử dụng trình điều khiển gốc thay vì Mongoose không hỗ trợ chèn hàng loạt tài liệu). Lý do tôi làm điều này là cải thiện tốc độ viết.Mongoose - RangeError: Kích thước ngăn xếp tối đa vượt quá
Tôi nhận được lỗi "RangeError: Tối đa Call Stack Kích Exceeded" tại console.log (err) trong mã dưới đây:
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();
}
});
}
Vì vậy, tương tự như: https://stackoverflow.com/questions/24356859/mongoose-maximum-call-stack-size-exceeded
Có lẽ đó là một cái gì đó về định dạng của mảng phản hồi mà Mongoose trả về có nghĩa là tôi không thể chèn trực tiếp bằng MongoDB một cách tự nhiên? Tôi đã thử .toJSON() trên mỗi câu trả lời nhưng không may mắn.
Tôi vẫn nhận được lỗi ngay cả với một lượng dữ liệu rất nhỏ nhưng lặp lại và gọi Mongoose lưu trên mỗi tài liệu riêng lẻ hoạt động tốt.
EDIT: Tôi nghĩ rằng nó có liên quan đến vấn đề này: http://howtosjava.blogspot.com.au/2012/05/nodejs-mongoose-rangeerror-maximum-call.html
schema của tôi cho câu trả lời là:
var ResponseSchema = new Schema({
user: {
type: Schema.ObjectId,
ref: 'User'
},
randomUUID: String,
status: String,
submitted: Date,
initialEmailId: String,
survey: String,
answers: [AnswerSchema]
});
Vì vậy, câu trả lời là một tiểu tài liệu trong câu trả lời. Không chắc chắn cách khắc phục nó mặc dù ....
Có lẽ không liên quan, nhưng 'callback()' được gọi hai lần nếu 'globalSurvey.questions' không trống. Gọi 'callback()' cuối cùng trong câu lệnh 'else':'} else {callback(); } '. –
Cảm ơn - yep đồng ý nhưng nghĩ rằng nó không liên quan .... đã không có quá khứ chèn chưa. – Andrew
Tôi đã chỉnh sửa để khắc phục sự cố đó. – Andrew