Quel est le meilleur moyen de modifier chaque document d’une grande collection MongoDB sans surcharger la mémoire?

Pour le moment, j’exécute cette tâche:

var skip = 0; var limit = 5; gulp.task('add coordinates to visits', function(done) { (function recurse() { Visit.find({}) .skip(skip) .limit(limit) .populate('zone') .exec(function cb(err, visits) { if (err) { throw err; } if (visits.length === 0) { return; } async.each(visits, function iterateEvents(visit, next) { if (!visit.zone) { return next(); } else if (!visit.coordinates.lat || !visit.coordinates.lng) { visit.coordinates = { lat: visit.zone.geo.coordinates.lat, lng: visit.zone.geo.coordinates.lng }; } visit.save(next); }, function cb(err) { if (err) { throw err; } skip += limit; setTimeout(recurse, 1000); }); }); })(); }); 

Mais je suis sûr qu’il doit exister une méthode plus élégante et optimale que d’utiliser skip , limit , `setTimeout. Existe-t-il une méthode mongo ou mongoose pour exécuter des tâches de mise à jour?

D’après notre conversation dans les commentaires, il semble que le querystream de querystream de Mongoose pourrait être ce que vous recherchez:

 var stream = Visits.find().populate('zone').stream(); stream.on('data', function processDoc(visit) { var self = this; if (visit.zone && (!visit.coordinates.lat || !visit.coordinates.lng)) { self.pause(); visit.update({ coordinates: { lat: visit.zone.geo.coordinates.lat, lng: visit.zone.geo.coordinates.lng } }, function(err, result) { if (err) { console.log(err); }; self.resume(); }); } }); stream.on('error', function(err) { console.log('error', err); }); stream.on('close', function() { console.log('closed'); });