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

MongoDB如何统计单月内交易子文档中对应商品的总数量

MongoDB指定月份商品交易总量统计方案

实现效果

查询products集合时会自动新增qtyInTransaction字段,示例中商品MIE的该字段返回结果为175,符合需求。

完整聚合查询代码

db.products.aggregate([
  {
    $lookup: {
      from: "productInTransaction",
      let: { productId: "$_id" },
      pipeline: [
        // 过滤2021年8月的交易,调整此处时间范围即可统计其他月份
        {
          $match: {
            transactionDate: {
              $gte: ISODate("2021-08-01T00:00:00.000Z"),
              $lt: ISODate("2021-09-01T00:00:00.000Z")
            }
          }
        },
        // 展开交易商品子数组
        { $unwind: "$productsInTransactions" },
        // 匹配当前商品的交易子项
        {
          $match: {
            $expr: {
              $eq: ["$productsInTransactions.productId", "$$productId"]
            }
          }
        },
        // 统计该商品当月总销量
        {
          $group: {
            _id: null,
            totalQty: { $sum: "$productsInTransactions.qty" }
          }
        }
      ],
      as: "transactionStats"
    }
  },
  // 新增qtyInTransaction字段,无匹配交易时默认返回0
  {
    $addFields: {
      qtyInTransaction: {
        $ifNull: [ { $first: "$transactionStats.totalQty" }, 0 ]
      }
    }
  },
  // 可选:移除临时统计字段,保留原有products字段+新增字段
  {
    $project: {
      transactionStats: 0
    }
  }
])

低版本MongoDB不支持$first操作符时,可将{ $first: "$transactionStats.totalQty" }替换为{ $arrayElemAt: ["$transactionStats.totalQty", 0] }兼容。

逻辑说明

  • 提前过滤交易日期,减少后续数据处理量,查询性能更高
  • 所有关联后的数据处理逻辑都在$lookup内置管道中完成,避免多余的内存占用
  • 兼容无交易记录的商品,不会返回null值

内容的提问来源于stack exchange,提问作者silvester landu hunggu wali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 08:57:02