Hola, resulta que toda mi vida use Node junto con MySQL, pero ahora se me dio por usar Mongo con Mongoose en un proyecto, y me estoy volviendo loco con algo.
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
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)
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 });
});