You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:37:25