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

MongoDB如何从父键未知的嵌套对象中筛选指定键值子对象

MongoDB 过滤动态键嵌套对象的实现方法

由于data下的子键名无固定规则,普通find查询的投影语法无法直接完成这类动态键过滤,需要通过聚合管道实现,兼容MongoDB 3.4及以上版本,代码如下:

db.yourCollection.aggregate([
  // 将动态键对象转换为可遍历的键值对数组
  { $addFields: { data: { $objectToArray: "$data" } } },
  // 过滤数组,仅保留call字段为true的项
  {
    $addFields: {
      data: {
        $filter: {
          input: "$data",
          as: "item",
          cond: { $eq: ["$$item.v.call", true] }
        }
      }
    }
  },
  // 将过滤后的数组转换回原对象结构
  { $addFields: { data: { $arrayToObject: "$data" } } }
])

逻辑说明

  • $objectToArray会把原data对象转换为固定结构的数组:每个数组元素包含k(对应原对象的键名)、v(对应原键的值)两个字段,无需提前知道子键命名即可遍历所有子属性
  • $filter遍历转换后的数组,通过$$item.v.call匹配每个子对象的call字段值,剔除不符合条件的项
  • $arrayToObject将过滤完成的数组重新转为普通对象结构,最终返回结果和预期格式完全一致:
{
  data: {
    second: { call: true },
    third: { call: true }
  }
}

注:如果使用3.4以下版本的MongoDB,无法通过内置运算符完成该操作,建议通过应用层查询后过滤,或升级数据库版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:06:32