sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo puedo usar un cursor.forEach() en MongoDB usando Node.js?

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();
  }
}