web-dev-qa-db-fra.com

Insert en vrac dans MongoDB à l'aide de mangouste

J'ai actuellement une collection à Mongodb dire "Collection1". J'ai le tableau suivant d'objets qui doivent être insérés dans MongoDB. J'utilise l'API Mongoose. Pour l'instant, j'itère à travers le tableau et j'insère chacun d'eux dans mongo. C'est correct pour l'instant, mais ce sera un problème lorsque les données sont trop volumineuses. J'ai besoin d'un moyen d'insérer les données en vrac dans MongoDB sans répétition. Je ne sais pas comment procéder. Je n'ai pas trouvé d'option groupée dans Mongoose.

Mon code ci-dessous

myData = [Obj1,Obj2,Obj3.......]

myData.forEach(function(ele){
      //console.log(ele)
     saveToMongo(ele);
    });
function saveToMongo(obj){
    (new Collection1(obj)).save(function (err, response) {
          if (err) {
             // console.log('Error while inserting: ' + obj.name + " " +err);
          } else {
            // console.log('Data successfully inserted');
          }
      });

      return Collection1(obj);
  }
13

Vous souhaiterez peut-être utiliser la méthode insertMany() ici si vous utilisez la dernière version de Mongoose 4.4.X Et plus, qui utilise essentiellement Model.collection.insertMany() sous le capot et le pilote pourrait gérer la parallélisation des documents >= 1000 pour vous.

myData = [Obj1, Obj2, Obj3.......];
Collection1.insertMany(myData, function(error, docs) {});

ou en utilisant Promises pour une meilleure gestion des erreurs

Collection1.insertMany(myData)
    .then(function(docs) {
         // do something with docs
    })
    .catch(function(err) {
        // error handling here
    });

Il fonctionne en créant un tas de documents, appelle .validate() sur eux en parallèle, puis appelle le pilote sous-jacent insertMany() = sur le résultat de toObject({ virtuals: false }); de chaque doc. Bien que insertMany() ne déclenche pas de hooks de pré-sauvegarde, il a de meilleures performances car il ne fait que 1 aller-retour vers le serveur plutôt que 1 pour chaque document.


Pour les versions Mongoose ~3.8.8, ~3.8.22, 4.x Qui prennent en charge le serveur MongoDB >=2.6.x, Vous pouvez utiliser le Bulk API comme suit

var bulk = Collection1.collection.initializeOrderedBulkOp(),
    counter = 0;

myData.forEach(function(doc) {
    bulk.insert(doc);

    counter++;
    if (counter % 500 == 0) {
        bulk.execute(function(err, r) {
           // do something with the result
           bulk = Collection1.collection.initializeOrderedBulkOp();
           counter = 0;
        });
    }
});

// Catch any docs in the queue under or over the 500's
if (counter > 0) {
    bulk.execute(function(err,result) {
       // do something with the result here
    });
}
26
chridam

vous pouvez passer un tableau d'objets à la fonction de création de modèle mangouste

var Collection1 = mongoose.model('Collection1');

Collection1.create(myData,function(err){
    if(err) ...
});
1
user3227295