Die Antwort hängt vom verwendeten Treiber ab. Alle mir bekannten MongoDB-Treiber haben cursor.forEach()
auf die eine oder andere Weise implementiert.
Hier sind einige Beispiele:
node-mongodb-native
collection.find(query).forEach(function(doc) {
// handle
}, function(err) {
// done or error
});
mongojs
db.collection.find(query).forEach(function(err, doc) {
// handle
});
Mönch
collection.find(query, { stream: true })
.each(function(doc){
// handle doc
})
.error(function(err){
// handle error
})
.success(function(){
// final callback
});
Mungo
collection.find(query).stream()
.on('data', function(doc){
// handle doc
})
.on('error', function(err){
// handle error
})
.on('end', function(){
// final callback
});
Aktualisierung von Dokumenten innerhalb von .forEach
Rückruf
Das einzige Problem beim Aktualisieren von Dokumenten innerhalb von .forEach
Rückruf ist, dass Sie keine Ahnung haben, wann alle Dokumente aktualisiert sind.
Um dieses Problem zu lösen, sollten Sie eine asynchrone Ablaufsteuerungslösung verwenden. Hier sind einige Optionen:
- asynchron
- Versprechungen (when.js, bluebird)
Hier ist ein Beispiel für die Verwendung von async
, unter Verwendung seiner 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();
}
}