Svaret beror på vilken drivrutin du använder. Alla MongoDB-drivrutiner jag känner har cursor.forEach()
implementeras på ett eller annat sätt.
Här är några exempel:
nod-mongodb-native
collection.find(query).forEach(function(doc) {
// handle
}, function(err) {
// done or error
});
mongojs
db.collection.find(query).forEach(function(err, doc) {
// handle
});
munk
collection.find(query, { stream: true })
.each(function(doc){
// handle doc
})
.error(function(err){
// handle error
})
.success(function(){
// final callback
});
mangus
collection.find(query).stream()
.on('data', function(doc){
// handle doc
})
.on('error', function(err){
// handle error
})
.on('end', function(){
// final callback
});
Uppdaterar dokument inuti .forEach
återuppringning
Det enda problemet med att uppdatera dokument inuti .forEach
återuppringning är att du inte har någon aning om när alla dokument är uppdaterade.
För att lösa detta problem bör du använda någon asynkron kontrollflödeslösning. Här är några alternativ:
- asynkron
- löften (when.js, bluebird)
Här är ett exempel på hur du använder async
, med hjälp av dess queue
funktion:
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();
}
}