如何查询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
相关产品推荐
相关产品推荐

