PyMongo(MongoDB)嵌套文档多条件匹配与聚合需求咨询
MongoDB 查询与聚合问题解答
一、关于find查询的问题
这不是MongoDB的bug,是你没搞清楚数组字段的匹配逻辑。你原来的查询是跨数组元素匹配——只要文档的studytypes数组里存在某一个元素满足filter:true,同时存在另一个元素满足id:4000,整个文档就会被返回,而不是要求同一个数组元素同时满足两个条件。
要实现“匹配数组中同一个元素同时满足id=4000且filter=true”的需求,需要用$elemMatch操作符,正确的查询语句如下:
db["schools"].find({ "studytypes": { "$elemMatch": { "id": 4000, "filter": true } } })
这个查询只会返回样本数据中的第一个文档,因为只有它的studytypes数组里存在同时符合两个条件的元素。
二、统计filter为True的不同id和name的数量
用聚合管道可以实现这个需求,分两种场景给出方案:
1. 统计每个(id,name)组合的出现次数
db["schools"].aggregate([ // 拆分数组,将每个元素转为独立文档 { "$unwind": "$studytypes" }, // 筛选出filter为true的记录 { "$match": { "studytypes.filter": true } }, // 按id和name分组,统计每组出现次数 { "$group": { "_id": { "id": "$studytypes.id", "name": "$studytypes.name" }, "出现次数": { "$sum": 1 } } } ])
执行后返回结果示例:
[ { "_id": { "id": 4000, "name": "For all" }, "出现次数": 1 }, { "_id": { "id": 4001, "name": "For girls" }, "出现次数": 1 } ]
2. 统计不同(id,name)组合的总数量
如果只需要知道符合条件的不同组合总数,在上述管道后追加$count阶段即可:
db["schools"].aggregate([ { "$unwind": "$studytypes" }, { "$match": { "studytypes.filter": true } }, { "$group": { "_id": { "id": "$studytypes.id", "name": "$studytypes.name" } } }, { "$count": "不同组合数量" } ])
执行后返回结果示例:
{ "不同组合数量": 2 }
内容的提问来源于stack exchange,提问作者Uniqpr0
相关产品推荐
相关产品推荐

