Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

431
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!