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

如何查询MongoDB嵌套guests数组统计总宾客数与attended为Y的出席人数

解决方案

提供两种实现方式,可根据你的业务场景选择:

方案1:查询后本地计算(实现最简单,适合宾客数量少的场景)

你已经通过findById拿到了完整的事件对象,直接对guests数组做统计即可,完整代码如下:

const event = await Event.findById(req.params.id);
// 先处理事件不存在的边界情况
if (!event) {
  return res.status(404).json({ error: '对应事件不存在' });
}
// 1. 统计宾客总人数
const totalGuests = event.guests.length;
// 2. 统计已出席人数
const attendedGuests = event.guests.filter(item => item.attended === 'Y').length;

// 按需返回结果
return {
  totalGuests,
  attendedGuests
}

方案2:MongoDB聚合查询(性能更高,适合宾客数量大的场景)

直接在数据库层完成统计,不需要把全量宾客数据拉到应用层,代码如下:

const mongoose = require('mongoose');

const statResult = await Event.aggregate([
  // 匹配指定ID的事件
  { $match: { _id: mongoose.Types.ObjectId(req.params.id) } },
  // 拆分宾客数组
  { $unwind: '$guests' },
  // 分组统计两个指标
  {
    $group: {
      _id: null,
      totalGuests: { $sum: 1 },
      attendedGuests: {
        $sum: {
          $cond: [{ $eq: ['$guests.attended', 'Y'] }, 1, 0]
        }
      }
    }
  }
]);

// 处理无数据的兜底情况
const finalResult = statResult[0] ?? { totalGuests: 0, attendedGuests: 0 };

注意事项

  • 聚合查询需要将传入的ID字符串转为MongoDB ObjectId类型,否则会匹配不到数据
  • 如果事件的guests字段可能不存在,可额外加判断逻辑避免报错

内容的提问来源于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 22:15:08