Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

428
Vistas
MongoDB, forEach & Promise: ¿Cómo saber cuándo se realiza un bucle forEach?

Para generar un archivo CSV, quiero crear una matriz de datos de una colección MongoDB.

Uso forEach en una promise y quiero resolve cuando se hayan leído todos los registros.

Sin embargo, mi código a continuación no funciona. La promise nunca se resuelve. Parece que hay un error con la condición if/else . ¿Hay otra forma de saber cuándo finaliza el bucle forEach ?

 exports.eachRecord = function () { return new Promise(function (resolve, reject) { var data = [] mongoClient.connect(process.env.MONGO, function (err, db) { // Handled connection error if (err) { return console.log(err) } db.collection('log').find().forEach(function (doc) { if (doc !== null) { console.log(doc.ug) data.push(doc.ug) } else { db.close() console.log('done!') resolve(data) } }) }) }) }

¿Alguna idea? Muchísimas gracias.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

El mongodb , desde v3.0, admite cursor.forEach(iterator, endCallback)

Debemos distinguir entre:

  • array.forEach: es sincronizar e iterar una matriz de elementos, todos cargados en la memoria después de toArray
  • mongoCursor.forEach: es asíncrono y lo gestiona el controlador mongo. Está transmitiendo los datos, por lo que puede colocarlos en un archivo o en una respuesta http.

Entonces, para archivar sus necesidades, solo necesita agregar una devolución de llamada:

 exports.eachRecord = function () { return new Promise(function (resolve, reject) { const data = [] mongoClient.connect(process.env.MONGO, function (err, db) { if (err) { return reject(err) } db.collection('log').find().forEach( doc => { data.push(doc.ug) }, err => { if (err) { return reject(err) } resolve(data) }) }) }) }
over 4 years ago · Santiago Trujillo Denunciar

0

forEach es síncrono.

El problema está en su llamada mongodb, que no es asíncrona. Puede hacerlo asíncrono agregándole una devolución de llamada.

 db.collection('log').find({}, (err, data) => { if (error) ... data.forEach((doc) => { ... }); // Whatever you want to do after forEach. });
over 4 years ago · Santiago Trujillo Denunciar

0

Puedes usar este código:

 function getData() { return new Promise((resolve, reject) => { var data = db.collection('credit_history').find({ 'history.dt': '2019-04-25' }).toArray((err, res) => { if (err) reject(err); resolve(res); }); }).catch((ex)=>{ console.log(ex); }); } var array_data =[] ; var data = await getData().then((data)=>{ data.forEach((el)=>{ console.log(el.p); array_data.push(el.p) ; }) });
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda