MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongoose - RangeError :taille maximale de la pile d'appels dépassée

J'avais le même problème et j'ai commencé à fouiller dans le code source de la mangouste (version 3.8.14). Finalement, cela m'a conduit à cette ligne dans

  • mongoose/node_modules/mongodb/lib/mongodb/collection/core.js -> insérer (...) -> 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);

Apparemment, cela appelle BSON.calculateObjectSize, qui appelle calculateObjectSize qui se répète ensuite à l'infini. Je n'ai pas pu creuser aussi loin dans ce qui l'a causé, mais j'ai pensé que cela pourrait avoir quelque chose à voir avec les fonctions de liaison de l'enveloppe de mangouste au schéma. Depuis que j'insérais des données brutes dans mongoDB, une fois que j'ai décidé de changer l'insertion en masse dans la mangouste en un objet javascript standard, le problème a disparu et les insertions en masse se sont déroulées correctement. Vous pourrez peut-être faire quelque chose de similaire.

Essentiellement, mon code est passé de

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