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

MongoDB如何查询路径中间包含未知字段的文档?

在MongoDB中查询路径含未知字段的嵌套结构

我经常遇到开发者问这个问题——毕竟Elasticsearch的路径通配符用起来太顺手了,但MongoDB的查询模型不一样,得换个思路。针对你给出的文档结构,我们可以用聚合管道来解构动态嵌套结构,实现你要的效果。

方法:使用聚合管道处理动态键

MongoDB的常规find()语法不支持路径中间的*通配符,但聚合管道可以帮我们拆解动态字段,筛选目标数据。完整的聚合查询如下:

db.collection.aggregate([
  // 1. 展开countries_info数组,逐个处理每个元素
  { $unwind: "$countries_info" },
  // 2. 将每个countries_info元素(动态键的对象)转成{k: 字段名, v: 日期数据}的数组
  {
    $addFields: {
      country_entries: { $objectToArray: "$countries_info" }
    }
  },
  // 3. 展开country_entries数组,得到每个动态字段的键值对
  { $unwind: "$country_entries" },
  // 4. 筛选出包含目标日期(1_1_2018)的条目
  {
    $match: {
      "country_entries.v.1_1_2018": { $exists: true }
    }
  },
  // 5. 提取需要的字段:国家/分组名、目标日期、passed值
  {
    $project: {
      _id: 0,
      country_or_group: "$country_entries.k",
      target_date: "1_1_2018",
      passed_count: "$country_entries.v.1_1_2018.allEvents.passed"
    }
  }
])

结果示例

针对你提供的示例文档,执行上述聚合后会返回两条结果:

[
  {
    "country_or_group": "country_name",
    "target_date": "1_1_2018",
    "passed_count": 5
  },
  {
    "country_or_group": "all_countries",
    "target_date": "1_1_2018",
    "passed_count": 5
  }
]

关键步骤拆解

  • $unwind: 把countries_info数组拆分成单个文档,方便后续处理每个嵌套元素。
  • $objectToArray: 将动态键的对象(比如{"country_name": {...}})转换成可遍历的键值对数组,让原本未知的字段名变得可访问。
  • $match: 过滤出包含目标日期的条目,减少无效数据处理。
  • $project: 按需提取字段,让结果结构更清晰直观。

扩展适配

如果动态字段的层级更深,只需要调整$objectToArray的应用位置,多做一次$unwind和筛选即可。比如要匹配countries_info.*.*.allEvents.passed,只需在日期层再做一次键值对转换。

内容的提问来源于stack exchange,提问作者Avishay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:17:45