MongoDB Aggregate分组异常:无法按省份与运动类型统计数据
问题原因与修正方案
问题核心
你的聚合查询中,$match阶段出现了重复的$or键。在JSON对象里,重复的键会被最后一个值覆盖,所以原查询里的省份过滤条件{$or: [{province: "Cologne"}, {province: "Berlin"}]}直接被后面的类型过滤条件覆盖了。最终$match只生效了类型过滤,完全没限制地区,自然会出现非柏林、科隆的数据。
修正后的查询
方式1:用$and组合两个$or条件
把两个$or放在$and的数组里,确保两个条件同时生效:
db.getCollection("Sport").aggregate([ {$match: { $and: [ {$or: [{province: "Cologne"}, {province: "Berlin"}]}, {$or: [{type: "Running"}, {type: "Swimming"}]} ] }}, {$group: {_id: {province: "$province", type: "$type"}, number: {$sum: 1}}}, {$sort: {number: -1}} ])
方式2:用$in简化条件(更简洁高效)
针对省份和类型的多值匹配,用$in替代$or,代码更清晰:
db.getCollection("Sport").aggregate([ {$match: { province: {$in: ["Cologne", "Berlin"]}, type: {$in: ["Running", "Swimming"]} }}, {$group: {_id: {province: "$province", type: "$type"}, number: {$sum: 1}}}, {$sort: {number: -1}} ])
额外说明
你之前尝试把$or嵌套进$and无效,大概率是嵌套格式写错了——$and需要接收一个条件数组,每个元素是独立的查询条件,不能直接写$and: {$or:..., $or:...}这种格式,必须把两个$or放在数组里。
内容的提问来源于stack exchange,提问作者Confuzius
相关产品推荐
相关产品推荐

