MongoDB分组统计时如何排除包含指定元素的结果计算C值
解决方案
你只需在原聚合查询的$group阶段新增C字段的统计逻辑即可,统计逻辑完全匹配你提出的规则:在满足B的前提(details数组非空)下,排除details下salesManagerIds包含指定数组任意元素的文档,剩余符合条件的文档计数为1,否则为0。
首先定义需要排除的销售ID数组:
const excludeManagerIds = [ObjectId("612f57184205db63a3396a9e"), ObjectId("612cb021278f621a222087d7")]
修改后的$group阶段完整代码如下:
{ $group: { _id: { $dateToString: { format: "%Y-%m-%d", date: "$createdAt" } }, // 原有A统计:分组内总文档数 A: { $sum: 1 }, // 原有B统计:details非空的文档数 B: { $sum: { $cond: [{ $gt: [{ $size: "$details" }, 0] }, 1, 0] } }, // 新增C统计 C: { $sum: { $cond: [ { $and: [ // 前置条件:满足B的要求,details数组非空 { $gt: [{ $size: "$details" }, 0] }, // 额外条件:details下所有salesManagerIds和排除数组无交集 { $eq: [ { $setIntersection: [ // 将当前文档所有details元素的salesManagerIds合并为一维数组 { $reduce: { input: "$details", initialValue: [], in: { $concatArrays: [ "$$value", // 可选:如果salesManagerIds可能不存在,加$ifNull避免报错 { $ifNull: ["$$this.salesManagerIds", []] } ] } } }, excludeManagerIds ] }, [] ] } ] }, 1, 0 ] } } } }
逻辑说明:用$reduce把单个文档下所有details项的salesManagerIds合并成一个一维数组,再通过$setIntersection计算和排除ID数组的交集,若交集为空说明没有需要排除的目标ID,符合统计条件则计1。
内容的提问来源于stack exchange,提问作者newbieeyo
相关产品推荐
相关产品推荐

