Tengo dos modelos. Uno es de clientes y otro de Application(que serian las veces que dicho cliente se aplico mi producto). Los 'application' tienen un campo cliente que hace referencia al id del cliente que lo compro. Yo pensaba que luego podría emular los joins de mysql, pero resulta que si no existe un un articulo para cada cliente entonces el populate no funciona, probe hacerlo con virtual, pero por lo que entendi de la doc de mongoose no funciona.
Entonces se me ocurrió hacerlo a la antigua, como trabajaba con PHP.
Primero leo todos los clientes de mi DD.BB. Y luego recorro el array con un foreach y para cada uno busco en la colección Application si existe una para dicho cliente. Pero no logro dominar la asincronia.
Lo que yo espero es que en consola se muestre algo como
Citar
00000000000000000 0000000000000000000
00000000000000000 0000000000000000000
00000000000000000 Sin Aplicaciones
00000000000000000 Sin Aplicaciones
00000000000000000 Sin Aplicaciones
00000000000000000 0000000000000000000
00000000000000000 0000000000000000000
00000000000000000 0000000000000000000
00000000000000000 Sin Aplicaciones
00000000000000000 Sin Aplicaciones
00000000000000000 Sin Aplicaciones
00000000000000000 0000000000000000000
00000000000000000 0000000000000000000
Y luego de eso se imprima console.log('C', C); Pero resulta que siempre se imprime antes de terminar el bucle forEach. Tengo los await en todas las llamadas a mongoose, por lo que la logica me dice que deberian ejecutarse todas las sentencias y finalmente imprimir en consola el contenido de C.
Me estoy volviendo loco, estoy a nada de volver a PHP (js y su p*ta asincronía)
Código
router.get('/', async (req, res, next) => { const clientes = await Client.find(); var C = []; //Traigo la ultima aplicacion si es que tiene await clientes.forEach(async (cliente, index) => { const application = await Application.findOne({ cliente: cliente._id, }); if (application) { console.log(cliente._id, application._id); } else { console.log(cliente._id, 'Sin Aplicaciones'); } }); console.log('C', C); return res.json({ ok: true, clientes }); });