当前位置: 首页 > 知识库问答 >
问题:

mongose-range error:超出了最大调用堆栈大小

弘承业
2023-03-14

我正在尝试将文档批量插入MongoDB(因此绕过Mongoose并使用本机驱动程序,因为Mongoose不支持批量插入文档数组)。我这样做的原因是为了提高写作速度。

我收到错误RangeError: Maximum Call Stack Size Exceeded在console.log(err)在下面的代码

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-mongose-range error-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个答案

越扬
2023-03-14

伙计们!我今天遇到了那个奇怪的错误。它的发生是因为我有一个带有ref属性的Schema,并试图传入create/update整个相关文档。我已经将参数更改为仅_id,这就成功了。像魅力一样工作。我在这里找到了答案(向下滚动到2013年2月21日,晚上8:05 gustavohenke评论)。

赖浩荡
2023-03-14

已确认,但不是错误。Model.collection.insert()绕过了猫鼬,因此您告诉节点驱动程序插入一个包含猫鼬内部结构的对象,如$__等。堆栈溢出可能是因为bson试图计算间接引用自身的对象的大小。

长话短说,使用Document.toObject(),这就是它的用途:http://mongoosejs.com/docs/api.html#document_Document-toObject

Response.find({}).exec(function(err, responses) {
  if (err) { 
    return callback(err); 
  }

  if (true) {
    var toInsert = [];
    responses.forEach(function(response) {
      console.log("Filling response: " + response._id);
      response.answers = [];
      [{ name: 'test' }].forEach(function(ans) {
        response.answers.push(ans);
      });
      toInsert.push(response.toObject());
    });
    Response.collection.insert(toInsert, function(err, responsesResult) {
      console.log(err);
    });
  } else {
      callback();
    }
});

此外,即使您修复了堆栈溢出,您指定的代码也不会工作。由于您试图< code>insert()数据库中已经存在的文档,所有的插入都将由于< code>_id冲突而失败。如果只是使用stream()一次读取一个结果,然后< code>save()将它们保存回数据库,效果会好得多。

邢同
2023-03-14

我也遇到了同样的问题,我开始挖掘mongoose源代码(版本3.8.14)。最终它引导我找到了内心的这条线

>

  • 猫鼬/node_modules/mongob/lib/mongob/集合/core.js-

    变量 bsonSize = bson.calculate对象大小(文档,假);

    显然,这调用了 BSON.calculate 对象大小,它调用计算对象大小,然后无限递归。我无法深入挖掘导致它的原因,但认为它可能与猫鼬包装器将函数绑定到架构有关。由于我将原始数据插入mongoDB,一旦我决定将猫鼬中的大容量插入更改为标准的html" target="_blank">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) {});
    

  •  类似资料:
    • 问题内容: 我想这意味着有一个循环引用,但是对于我的一生,我无法猜测如何解决它。 有人有主意吗? http://plnkr.co/edit/aNcBcU?p=预览 检查Chrome中的调试控制台(例如),您将看到错误。冒犯的行是 通过以下方式在控制器上对scope.map进行“ $ watched” 问题答案: 这是因为您要比较对象是否相等,而不是参考。将您的声明更改为此:

    • 这是我在React中的第一个应用程序。在localhost中,一切正常,当我使用Github Pages部署时,我的应用程序(Info/Images/evenements)中的一些页面无法呈现。每次单击他们的链接访问他们时,我都会在控制台上看到一个白色页面和此错误: range error:object . tostring处超出了最大调用堆栈大小 同样,当我刷新页面时,github pages返

    • 我将redux添加到我的项目中进行状态管理,在添加reducer之前一切都很好 我认为每个中间件功能的下一步(操作)都会导致问题,但我不知道如何修复它。 我使用的是React 17.0.2,React redux 7.2.3,redux 4.1.2。 动作-- 中间件-- 中间件-- 减速机 -- 商店.js:

    • 如果我逃跑 在铬33上,我得到 为什么?

    • 问题内容: 我试图将文档批量插入MongoDB中(因此绕过Mongoose并使用本机驱动程序,因为Mongoose不支持批量插入文档数组)。我这样做的原因是为了提高写作速度。 我在以下代码中的console.log(err)处收到错误“ RangeError:超出最大调用堆栈大小”: 也许与Mongoose返回的响应数组的格式有关,这意味着我不能直接使用MongoDB进行本机插入吗?我已经在每个响

    • 当我为图表(react-chartjs-2)获取数据时,我收到了这个错误。我实现了try/catch块,但不知道如何删除这个错误。在Edge浏览器上,我得到了CRIPT28:SCRIPT28:堆栈空间不足 这是我在组件中调用的操作。 这是连接到redux存储的组件。它在我看来一切都很好。