MongoDB聚合$group阶段如何为$addToSet添加条件判断
解决方案
完全可以直接在$group阶段实现该需求,不需要额外新增独立的聚合过滤阶段。
实现逻辑非常简单:在$addToSet的取值表达式中加入$cond条件判断,不符合age=20要求时传入系统变量$$REMOVE即可——$addToSet运算符遇到$$REMOVE时会自动跳过当前值,不会向结果集合中写入任何内容。
修改后的聚合代码如下:
{ $group: { _id: { bins: { $dateTrunc: { date: '$timestamp', unit: 'week', binSize: 1 } } }, 'NamesWithAge20': { $addToSet: { $cond: { if: { $eq: ['$age', 20] }, then: '$name', else: '$$REMOVE' } } } } }
用你提供的两个测试文档运行上述代码,最终NamesWithAge20集合中只会存在Max,age为21的Brian不会被加入集合,完全符合你的需求。
如果你的聚合任务不需要保留age不等于20的文档做其他指标统计,也可以在$group阶段前增加$match: {age: 20}过滤条件,能减少后续阶段处理的数据量,提升聚合运行效率;如果同分组下还需要计算其他年龄段的相关聚合值,直接使用上面的$group内条件判断写法即可。
内容的提问来源于stack exchange,提问作者TheStranger
相关产品推荐
相关产品推荐

