2017-09-29 6 views
7

J'essaie d'utiliser une suppression groupée sur les résultats d'une requête agrégée mongoose.Suppression en bloc de documents de l'agrégat

var bulk = Collection.collection.initializeUnorderedBulkOp(); 
var cursor = Collection.aggregate(query).cursor({batchSize: 1000}).exec(); 

cursor.each(function(error, doc){ 
    if(doc){ 
    console.log(doc); 
    bulk.find({_id : doc._id}).removeOne(); 
    } 
}); 

if(bulk.length > 0) { 
    bulk.execute(function(error){ 
    if(error){ 
     console.error(error); 
     callback(error); 
    }else{ 
     console.log(bulk.length + " documents deleted"); 
     callback(null); 
    } 
    }); 
} else { 
    console.log("no documents to delete"); 
    callback(null); 
} 

Il en résulte des « aucun document à supprimer » en cours d'impression avant que les résultats de l'ensemble de la chaque boucle. Normalement je m'attendrais à ce qu'il y ait une fonction de rappel pour une opération de base de données. Je l'ai essayé d'ajouter une fonction de rappel aux params de exec, mais la fonction ne Reçoit:

var cursor = Collection.aggregate(query).cursor({batchSize: 1000}).exec(function(error, result){ 
    console.log(error); 
    console.log(result); 
    callback(); 
}); 

Répondre

4

Écoutez les données et les événements finaux sur le curseur:

cursor.on('data', function(data) { 
    bulk.find({ "_id" : data._id }).removeOne(); 
}); 

cursor.on('end', function() { 
    if (bulk.length === 0) { 
     callback(); 
    } else { 
     bulk.execute(function (error) { 
      if (error) { 
       callback(error); 
      } else { 
       callback(); 
      } 
     }); 
    } 
}); 
+0

Je voudrais également exécuter le vrac après une période de temps car il peut planter l'application, car il manque de mémoire. Disons après toutes les 5000k commandes. – Azarus

0

Quelle version de mangouste? Il y a un issue on github qui pourrait être pertinent. Alors peut-être essayer:

var stream = Model 
.aggregate(pipeline) 
.cursor({ batchSize: 1000 }) 
.exec().stream(); 

stream.on('data', function(doc) { 
    // ... 
});