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

如何统计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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:18:04