Node.js 如何执行多个查询并将所有数据发送到模板,以便在单个res.render中进行渲染?

Node.js 如何执行多个查询并将所有数据发送到模板,以便在单个res.render中进行渲染?,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我有一个名为CriterPedia的MongoDB数据库,包含3个集合:鱼、虫子、海洋生物。我试图查询这些集合,以呈现将于本月离开的生物。下面是我的鱼收集查询,它可以工作并呈现。如何对其他两个集合执行相同的查询,但通过单个res.render()调用一次发送所有数据 理想情况下,我希望: //Query fish collection //Query Bugs collection //Query Sea collection //res.render('index', {fish : fish

我有一个名为CriterPedia的MongoDB数据库,包含3个集合:鱼、虫子、海洋生物。我试图查询这些集合,以呈现将于本月离开的生物。下面是我的鱼收集查询,它可以工作并呈现。如何对其他两个集合执行相同的查询,但通过单个res.render()调用一次发送所有数据

理想情况下,我希望:

//Query fish collection
//Query Bugs collection
//Query Sea collection
//res.render('index', {fish : fish, bugs : bugs, sea : sea});

提前谢谢你

嗯,很简单,你甚至都不会相信

与使用
$merge
$lookups
编写庞大的
模型。聚合
查询不同,您可以创建3个
。一次(并行)、通过或

你也可以在之前做出一系列承诺,比如:

let futureFinds = [];

if (need to search for fish) {
    futureFinds.push(await fish_db.find(query))
}

if (need to search for bugs) {
    futureFinds.push(await bugs_db.find(query))
}

const [result_one, result_two] = await Promise.all(futureFinds)

然后立即处理它们,正如您在上面的代码中所看到的。

我已经为您的问题添加了一个答案,请添加您的反应,它是否会帮助您。如果它提供了有用的信息或接受它作为答案,请向上投票。谢谢你的回复,并用打字机把这篇文章写下来!我仍然在学习,并且正在做这个项目作为一个学习环境。老实说,很多事情我都想不通,但我正试图打破它。res.status(200).json(response)调用发送的数据吗?我正在使用一个EJS模板进行渲染,并试图找出我将使用什么来分解JSON对象以渲染到浏览器
等。
响应
是您想通过
{fish:fish,bugs:bugs,sea:sea}
看到的对象您可以通过
控制台.log(response)
res.status(200)
之前添加此字符串,并监视服务器控制台。@MattMiller,如果要
res.send
EJS模板,可以在
res
事件完成之前预先添加。(如果没有添加),但是tbh,最好将前端页面和后端逻辑分开。并为它制作一个API。实际上,我使用了一个API来获取数据。为了进一步了解Mongo/mongoose,我编写了一个脚本,从API中提取数据并将其放入数据库中。这就是我一直在处理的问题,现在我意识到这样做可能是一个错误。@MattMiller根据Express文档()您应该传递文件和对象,例如:
res.render('user',{name:'Tobi',function(err,html){…}
const express = require('express');
const router = express.Router();

/**
 * Model importing / Collections
 */

const fish_db = require("../../db/fish_db");
const bug_db = require("../../db/bug_db");
const sea_db = require("../../db/sea_db");

router.get('/critters', async function(req, res) {
    try {
        let response = {};
        /**
        * You could form / pre-determine more queries, for each of your collection
        */
        let query = {$and: [{fishMonthsNorth: thisMonth}, {fishMonthsNorth: {$ne: nextMonth}}]};
        /**
        * Promise.allSettled is ES2020 feature, you could use Promise.all instead
        * or for await of arrayOfPromises
        */
        await Promise.allSettled([
           fish_db.find(query).then(docs => { Object.assign(response, {fish: docs}) } )
           bug_db.find(query).then(docs => { Object.assign(response, {bug: docs}) } )
           sea_db.find(query).then(docs => { Object.assign(response, {sea: docs}) } )
        ])
        /** You could add almost anything to response if you want it to */
        await res.status(200).json(response);
    } catch (e) {
        await res.status(404).json(e);
    }
});

module.exports = router;
let futureFinds = [];

if (need to search for fish) {
    futureFinds.push(await fish_db.find(query))
}

if (need to search for bugs) {
    futureFinds.push(await bugs_db.find(query))
}

const [result_one, result_two] = await Promise.all(futureFinds)