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 } } ])
代码说明
$match阶段:先筛选出日期为20221101且至少有一条成功购买记录的文档,减少后续计算的数据量。$addFields阶段:用$filter过滤出每个文档中status为SUCCESS的购买记录,再通过$size计算该数组长度,得到当前文档的成功记录数successCount。$group阶段:按productCode和time分组,$sum:1统计分组内的文档总数(docCount),$sum:"$successCount"累加所有文档的成功记录数得到purchaseHistCount。$project阶段:调整输出结构,移除默认的_id字段,将分组_id中的字段提取到顶层,匹配需求的输出格式。
内容的提问来源于stack exchange,提问作者usr_11
相关产品推荐
相关产品推荐

