一尘不染

猫鼬-RangeError:超出最大调用堆栈大小

node.js

我试图将文档批量插入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]
});

因此,答案是响应中的子文档。不知道如何解决它…。


阅读 216

收藏
2020-07-07

共1个答案

一尘不染

我遇到了同样的问题,我开始研究猫鼬的源代码(版本3.8.14)。最终它引导我进入了这条线

  • mongoose / node_modules / mongodb / lib / mongodb / collection / core.js-> 插入 (…)-> insertWithWriteCommands (…)->
  • mongoose / node_modules / mongodb / lib / mongodb / collection / batch / ordered.js-> bulk.insert(docs [i]) -> addToOperationsList(…) -> bson.calculateObjectSize(document,false);

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) {});
2020-07-07