La respuesta depende del controlador que esté utilizando. Todos los controladores de MongoDB que conozco tienen cursor.forEach()
implementado de una forma u otra.
Estos son algunos ejemplos:
nodo-mongodb-nativo
collection.find(query).forEach(function(doc) {
// handle
}, function(err) {
// done or error
});
mongojs
db.collection.find(query).forEach(function(err, doc) {
// handle
});
monje
collection.find(query, { stream: true })
.each(function(doc){
// handle doc
})
.error(function(err){
// handle error
})
.success(function(){
// final callback
});
mangosta
collection.find(query).stream()
.on('data', function(doc){
// handle doc
})
.on('error', function(err){
// handle error
})
.on('end', function(){
// final callback
});
Actualización de documentos dentro de .forEach
devolución de llamada
El único problema con la actualización de documentos dentro de .forEach
devolución de llamada es que no tiene idea de cuándo se actualizan todos los documentos.
Para resolver este problema, debe usar alguna solución de flujo de control asíncrono. Estas son algunas opciones:
- asincrónica
- promesas (when.js, bluebird)
Aquí hay un ejemplo del uso de async
, usando su queue
característica:
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();
}
}