You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB查询返回数组如何提取totalGuests与attendedGuests存为变量

问题修正与实现方案

你现有代码存在两个核心问题:

  1. res.render 放在了统计查询逻辑之前,就算你算出totalGuests和attendedGuests也没法传递到前端模板
  2. 直接调用find方法返回的是MongoDB查询游标,不是实际的查询结果,你需要加await+调用toArray(),或者直接改用更适合单条查询的findOne方法

修正后可直接运行的代码

module.exports.showEvent = async(req, res,) => {
    const event = await Event.findById(req.params.id).populate('artist');
    if (!event) {
        req.flash('error', 'Cannot find that Event');
        return res.redirect('/events');
    }
    const { guest_id } = req.cookies;
    // 改用findOne查询单条,直接拿到对象不用处理数组,记得加await
    const guestStats = await Event.collection.findOne({ _id: req.params.id},
      {
        _id: 1,
        name: 1,
        guests: 1,
        totalGuests: {
          $size: "$guests"
        },
        attendedGuests: {
          $size: {
            "$filter": {
              input: "$guests",
              cond: {
                $eq: [
                  "$$this.attended",
                  "Y"
                ]
              }
            }
          }
        }
      });
    // 提取两个值存入变量
    const { totalGuests, attendedGuests } = guestStats;
    console.log('总报名人数:', totalGuests, '已出席人数:', attendedGuests);
    // 把两个变量传给模板,前端直接用变量名渲染即可
    res.render('events/show', { event, totalGuests, attendedGuests });
};

取值逻辑说明

  • 如果你坚持要用find方法做查询,需要在后面加.toArray()拿到结果数组,再取数组第一个元素即可:
    const lookUpArr = await Event.collection.find(查询条件, 投影配置).toArray();
    const { totalGuests, attendedGuests } = lookUpArr[0];
    
  • 前端模板里可以直接读取传过去的totalGuests和attendedGuests变量做展示,不需要额外处理。

内容的提问来源于stack exchange,提问作者econobro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:45:07