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

MongoDB聚合查询:提取文档中指定属性为True的字段名

MongoDB聚合查询:提取嵌套属性中flag为true的属性名数组

直接用以下聚合管道就能实现你要的效果,既过滤出至少有一个flag为true的文档,又把符合条件的属性名转换成数组:

db.collection.aggregate([
  // 过滤出至少包含一个flag为true的文档
  {
    $match: {
      $expr: {
        $gt: [
          {
            $size: {
              $filter: {
                input: { $objectToArray: "$houseDetails" },
                cond: { $eq: ["$$this.v.flag", true] }
              }
            }
          },
          0
        ]
      }
    }
  },
  // 将符合条件的属性名提取为数组
  {
    $project: {
      houseDetails: {
        $map: {
          input: {
            $filter: {
              input: { $objectToArray: "$houseDetails" },
              cond: { $eq: ["$$this.v.flag", true] }
            }
          },
          in: "$$this.k"
        }
      }
    }
  }
])

各阶段说明:

  • $match阶段:
    先用$objectToArray把houseDetails对象转成{k: 属性名, v: 属性值}的键值对数组,再用$filter筛选出v.flag为true的元素,最后通过$size判断筛选后的数组长度是否大于0,以此过滤出符合条件的文档。

  • $project阶段:
    重复$objectToArray+$filter的操作拿到所有flag为true的键值对,再用$map把每个元素的k(属性名)提取出来,组成新的数组赋值给houseDetails,得到你要的最终格式。

如果你的实际文档里houseDetails还有其他嵌套层级,只需要调整cond里的路径(比如$$this.v.xxx.flag)就能适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:45:35