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);
}
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
});
}
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) ...
});