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
相关产品推荐
相关产品推荐

