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.
El mongodb , desde v3.0, admite cursor.forEach(iterator, endCallback)
Debemos distinguir entre:
toArrayEntonces, 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) }) }) }) }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. });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) ; }) });