Het antwoord hangt af van het stuurprogramma dat u gebruikt. Alle MongoDB-stuurprogramma's die ik ken, hebben cursor.forEach()
op de een of andere manier geïmplementeerd.
Hier zijn enkele voorbeelden:
node-mongodb-native
collection.find(query).forEach(function(doc) {
// handle
}, function(err) {
// done or error
});
mongo's
db.collection.find(query).forEach(function(err, doc) {
// handle
});
monnik
collection.find(query, { stream: true })
.each(function(doc){
// handle doc
})
.error(function(err){
// handle error
})
.success(function(){
// final callback
});
mangoest
collection.find(query).stream()
.on('data', function(doc){
// handle doc
})
.on('error', function(err){
// handle error
})
.on('end', function(){
// final callback
});
Documenten bijwerken binnen .forEach
terugbellen
Het enige probleem met het bijwerken van documenten in .forEach
terugbellen is dat je geen idee hebt wanneer alle documenten zijn bijgewerkt.
Om dit probleem op te lossen, moet u een asynchrone besturingsstroomoplossing gebruiken. Hier zijn enkele opties:
- async
- beloften (when.js, bluebird)
Hier is een voorbeeld van het gebruik van async
, met behulp van de queue
functie:
var q = async.queue(function (doc, callback) {
// code for your update
collection.update({
_id: doc._id
}, {
$set: {hi: 'there'}
}, {
w: 1
}, callback);
}, Infinity);
var cursor = collection.find(query);
cursor.each(function(err, doc) {
if (err) throw err;
if (doc) q.push(doc); // dispatching doc to async.queue
});
q.drain = function() {
if (cursor.isClosed()) {
console.log('all items have been processed');
db.close();
}
}