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

MongoDB $group聚合如何带条件取status为true的最小dateModified值

MongoDB 分组聚合实现条件最小值与全量计数方案

需求说明

需要按name字段完成分组聚合,同时实现两类统计逻辑:

  • 仅取分组内status为true的文档中dateModified字段的最小值
  • 统计分组下所有文档(包含status: true、status: false)的总条数,不可在$group阶段前使用$match: {status: true}过滤,否则会丢失非true状态的文档导致总条数统计错误

问题复现

现有测试数据:

[
  {name: "one", dateModified: "4", status: true},
  {name: "one", dateModified: "2", status: false},
  {name: "one", dateModified: "3", status: true}
]

初始错误聚合写法:

.aggregate([
  {
    $group: {
      _id: "$name",
      date: {$min: "$dateModified"}, // 此处会统计所有文档的最小值,不符合要求
      total: {$sum: 1}
    }
  }
])

上述写法执行后date字段返回值为2,但预期返回status: true文档中的最小dateModified值3,同时需要保留全量文档的计数结果。

正确实现方案

在$group阶段使用$cond条件运算符控制参与$min计算的值:当status为true时传入dateModified值,否则传入null,$min运算符会自动忽略null值,不会影响最小值计算,同时$sum:1可以正常统计全量文档数。
完整聚合代码:

db.你的集合名.aggregate([
  {
    $group: {
      _id: "$name",
      date: {
        $min: {
          $cond: [
            { $eq: ["$status", true] },
            "$dateModified",
            null
          ]
        }
      },
      total: { $sum: 1 }
    }
  }
])

执行结果

针对给出的测试数据,执行后返回结果符合预期:

[
  {
    _id: "one",
    date: "3",
    total: 3
  }
]

注:该写法兼容dateModified为字符串、数值、日期类型的场景,比较逻辑与原生$min完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:27:17