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

MongoDB聚合查询:统计指定条件下的文档数与成功购买记录数

MongoDB聚合查询实现指定统计需求

我有一个名为products的集合,示例文档如下:

第一个文档

{
  "date": 20221101,
  "time":1500,
  "productCode": "toycar",
  "purchaseHistory": [
    {
      "clientid": 123,
      "status": "SUCCESS"
    },
    {
      "clientid": 456,
      "status": "FAILURE"
    }
  ]
}

第二个文档

{
  "date": 20221101,
  "time": 1500,
  "productCode": "toycar",
  "purchaseHistory": [
    {
      "clientid": 890,
      "status": "SUCCESS"
    },
    {
      "clientid": 678,
      "status": "SUCCESS"
    }
  ]
}

需要查询date=20221101且purchaseHistory.status='SUCCESS'的文档,输出格式如下:

{"productCode":"toycar", "time": 1500, "docCount": 2, "purchaseHistCount":3}

我尝试了以下聚合代码,但无法得到完整结果:

db.products.aggregate({
  $match : {date:20221101, 'purchaseHistory.status':'SUCCESS'},
  "$group": {
    "_id": {
      "pc": "$productCode",
      "time": "$time"
    },
    "docCount": {$sum :1}
  }
})

解决方案

要同时统计符合条件的文档数量(docCount)和成功的购买记录总数(purchaseHistCount),需要在聚合流程中增加步骤计算每个文档内的成功记录数,再进行分组求和:

db.products.aggregate([
  // 筛选符合日期且包含成功购买记录的文档
  {
    $match: {
      date: 20221101,
      "purchaseHistory.status": "SUCCESS"
    }
  },
  // 计算每个文档内成功购买记录的数量
  {
    $addFields: {
      successCount: {
        $size: {
          $filter: {
            input: "$purchaseHistory",
            cond: { $eq: ["$$this.status", "SUCCESS"] }
          }
        }
      }
    }
  },
  // 按productCode和time分组,统计文档数和成功记录总数
  {
    $group: {
      _id: {
        productCode: "$productCode",
        time: "$time"
      },
      docCount: { $sum: 1 },
      purchaseHistCount: { $sum: "$successCount" }
    }
  },
  // 调整输出格式,移除_id并提取所需字段到顶层
  {
    $project: {
      _id: 0,
      productCode: "$_id.productCode",
      time: "$_id.time",
      docCount: 1,
      purchaseHistCount: 1
    }
  }
])

代码说明

  1. $match阶段:先筛选出日期为20221101且至少有一条成功购买记录的文档,减少后续计算的数据量。
  2. $addFields阶段:用$filter过滤出每个文档中status为SUCCESS的购买记录,再通过$size计算该数组长度,得到当前文档的成功记录数successCount。
  3. $group阶段:按productCode和time分组,$sum:1统计分组内的文档总数(docCount),$sum:"$successCount"累加所有文档的成功记录数得到purchaseHistCount。
  4. $project阶段:调整输出结构,移除默认的_id字段,将分组_id中的字段提取到顶层,匹配需求的输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:31:02