如何统计MongoDB中events字段下非空的子文档总数
如何统计MongoDB集合中events字段下非空子文档的总数
嘿,这个需求用MongoDB的聚合框架就能轻松搞定!我来给你详细拆解一下怎么做👇
你的需求是:跨所有文档累计统计events字段下不为null的子文档数量,比如你给出的两个示例文档,最终结果应该是3(name1的created、edited,name2的created这三个非空项)。
实现思路
我们可以通过以下几个步骤完成统计:
- 把
events对象转换成键值对数组,方便后续过滤操作 - 过滤掉数组中值为
null的元素 - 计算每个文档的有效子文档数量
- 累计所有文档的有效数量得到总和
完整聚合查询代码
db.collection.aggregate([ // 将events对象转为键值数组,每个元素格式为 {k: 字段名, v: 字段值} { $addFields: { eventEntries: { $objectToArray: "$events" } } }, // 筛选出值不为null的事件子文档 { $addFields: { validEvents: { $filter: { input: "$eventEntries", cond: { $ne: ["$$this.v", null] } } } } }, // 计算当前文档的有效事件数量 { $addFields: { validCount: { $size: "$validEvents" } } }, // 累计所有文档的有效数量总和 { $group: { _id: null, totalValidEvents: { $sum: "$validCount" } } }, // 移除默认的_id字段,让输出更简洁直观 { $project: { _id: 0, totalValidEvents: 1 } } ])
简化版查询(合并步骤)
如果想要更紧凑的代码,可以把多个步骤合并,效果是一样的:
db.collection.aggregate([ { $group: { _id: null, totalValidEvents: { $sum: { $size: { $filter: { input: { $objectToArray: "$events" }, cond: { $ne: ["$$this.v", null] } } } } } } }, { $project: { _id: 0 } } ])
结果验证
针对你给出的两个示例文档,运行上面的查询后,会返回:
{ "totalValidEvents": 3 }
完全符合你的预期结果。
内容的提问来源于stack exchange,提问作者Kake_Fisk
相关产品推荐
相关产品推荐

