let comments = await Comment.find({ post }) .populate({ path: "user", select: "name photoURL role page" }) .sort({ createdAt: -1 }); console.log("comments --", comments); const pages = []; let pagesData = comments.map(async (comment) => { let page = await Pages.find({ user: comment.user._id }); console.log("page", page); pages.push(page); }); console.log("Pages -- ", pagesData); Tengo este código en el que estoy tratando de obtener documentos de un db. Cuando registro los registros escritos anteriormente, obtengo los resultados esperados para los comments y la page y no para pages o los datos de pagesData .
pagesData registro de datos de páginas me da:
Pages -- [ Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> }, Promise { <pending> } ] El registro de páginas me da una matriz vacía como se inicializó, los resultados de la consulta en las páginas no se envían a las pages de la matriz.
Sin embargo, obtengo todos los resultados esperados en los registros de page individuales. ¿Cómo puedo agregar estos resultados a una sola estructura de datos? Cualquier ayuda apreciada.
Gracias por adelantado.
La función de mapa no promete que necesita usar el método Promise.all y consolar la matriz de páginas.
const pages = []; let pagesData = comments.map(async (comment) => { let page = await Pages.find({ user: comment.user._id }); console.log("page", page); pages.push(page); }); await Promise.all(pagesData); console.log("Pages -- ", pages);La solución anterior resolverá el problema de la promesa pendiente, pero este no es un buen enfoque para consultar en la base de datos en un bucle,
Puede probar el siguiente enfoque para seleccionar todas las páginas mediante una sola consulta,
$in para seleccionar todos los usuarios que tienen _id de la matriz let pages = await Pages.find({ user: { $in: comments.map((comment) => comment.user._id); } }); console.log("Pages -- ", pages);