如何在MongoDB聚合的$group中结合$regex实现分组统计?
解决方案:MongoDB分组统计名字含"ava"的人数
方案一:一次性统计两类人数(返回单个结果文档)
使用$regexMatch聚合操作符判断名字是否匹配,配合$cond和$sum完成分组计数:
db.contact.aggregate([ { $group: { _id: null, // 统一分组到一个结果中 含ava人数: { $sum: { $cond: [ { $regexMatch: { input: "$name", regex: /ava/i } }, // 判断是否匹配不区分大小写的ava 1, // 匹配则加1 0 // 不匹配则加0 ] } }, 不含ava人数: { $sum: { $cond: [ { $regexMatch: { input: "$name", regex: /ava/i } }, 0, 1 ] } } } } ])
执行后会返回一个文档,直接给出两类人数的统计结果。
方案二:按匹配状态分组(返回两个结果文档)
先通过$addFields给每个文档添加匹配标记,再按标记分组统计:
db.contact.aggregate([ { $addFields: { 包含ava: { $regexMatch: { input: "$name", regex: /ava/i } } } }, { $group: { _id: "$包含ava", // 按是否包含ava分组 人数: { $sum: 1 } } } ])
执行后会返回两个文档,分别对应_id: true(含ava)和_id: false(不含ava)的人数统计。
你之前代码的问题
$group阶段的语法不符合MongoDB聚合规则:你不能直接在$group的字段中写查询用的$regex,必须使用聚合阶段的操作符(比如$regexMatch)来实现条件判断,再结合聚合表达式完成计数逻辑。
内容的提问来源于stack exchange,提问作者Rizal
相关产品推荐
相关产品推荐

