javascript - tutorial - mongoose معنى




Mongoose-RangeError: تجاوز الحد الأقصى لحجم مكدس المكالمات (4)

أحاول إدخال المستندات في MongoDB بشكل كبير (لذا تجاوز Mongoose واستخدام برنامج التشغيل الأصلي بدلاً من ذلك ، حيث لا يدعم Mongoose إدخال مجموعة كبيرة من المستندات). السبب في ذلك هو تحسين سرعة الكتابة.

أتلقى الخطأ "RangeError: Exceeded Maximum Call Stack Size" في 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-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]
}); 

إذن ، الإجابات هي مستند فرعي ضمن الردود. غير متأكد من كيفية اصلاحها على الرغم من ....


رفاق! لقد واجهت هذا الخطأ الغريب اليوم. حدث ذلك لأن لدي مخطط مع خصائص ref وحاولت أن تمر في create / update كامل الوثيقة ذات الصلة. لقد غيرت الحجة إلى _id فقط والتي فعلت الخدعة. يعمل كالسحر. لقد وجدت الإجابة here (انتقل لأسفل حتى February 21, 2013, 8:05 pm gustavohenke تعليق February 21, 2013, 8:05 pm gustavohenke ).


كنت أواجه هذه المشكلة نفسها وبدأت في الحفر من خلال شفرة المصدر النمس (الإصدار 3.8.14). في النهاية قادني إلى هذا الخط في الداخل

  • mongoose / node_modules / mongodb / lib / mongodb / collection / core.js -> insert (...) -> insertWithWriteCommands (...) ->
  • mongoose / node_modules / mongodb / lib / mongodb / collection / batch / order.js -> bulk.insert (docs [i]) -> addToOperationsList (...) -> bson.calculateObjectSize (document، false)؛

    var bsonSize = bson.calculateObjectSize (مستند ، خطأ) ؛

على ما يبدو ، هذا يستدعي BSON.calculateObjectSize ، الذي يستدعي calculateObjectSize الذي ثم recurses اللانهائية. لم أكن قادرة على حفر ذلك إلى ما تسبب في ذلك ، ولكن احسب أنه قد يكون لها علاقة مع وظائف ملزمة المجمع النمس للمخطط. بما أنني كنت أقوم بإدخال بيانات أولية إلى mongoDB ، فبمجرد أن أقوم بتغيير إدراج الجزء الأكبر في النمس إلى كائن جافا سكريبت قياسي ، فإن المشكلة اختفت ، وحدثت الإدخالات المجمعة بشكل صحيح. قد تكون قادرًا على القيام بشيء مماثل.

أساسا ، ذهب رمز بلدي من

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

مؤكد ، ولكن ليس علة. 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();
    }
});

أيضًا ، لن تعمل التعليمة البرمجية التي حددتها حتى إذا قمت بإصلاح تجاوز سعة مكدس الذاكرة المؤقتة. نظرًا لأنك تحاول insert() المستندات الموجودة بالفعل في قاعدة البيانات ، فستفشل جميع _id بسبب تعارض _id . كنت حقا أفضل بكثير من مجرد استخدام دفق () لقراءة النتائج في وقت واحد ثم save() لهم مرة أخرى في ديسيبل.


واجهت مشكلة مماثلة ، حيث أنني كنت أستفسر عن حقل لم يكن موجودًا في المخطط باستخدام $ ne (قد يكون لمشغلي الاستعلام الآخرين مشكلة مشابهة)

var TestSchema = new Schema({
  test:[]
});
...
models.Test.findOne({"test2": {$ne: "t"} })...

في المثال أعلاه ، أختبر اختبار test2 بدلاً من الاختبار





mongoose