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

如何在MongoDB集合中查询含bool1或bool2为true的文档?

MongoDB查询任意位置bool1或bool2为true的文档

针对你这种嵌套动态键的文档结构,普通固定路径查询无法覆盖所有可能的bool1/bool2位置,需要用MongoDB的聚合表达式结合$expr实现遍历判断。

正确查询命令(兼容全版本)

db.dbname.find({
  $expr: {
    $anyElementTrue: [
      {
        $reduce: {
          input: { $objectToArray: "$data groups" },
          initialValue: [],
          in: {
            $concatArrays: [
              "$$value",
              {
                $map: {
                  input: "$$this.v",
                  as: "clientItem",
                  in: {
                    $anyElementTrue: [
                      {
                        $reduce: {
                          input: { $objectToArray: "$$clientItem.data" },
                          initialValue: [],
                          in: {
                            $concatArrays: [
                              "$$value",
                              [ "$$this.v.bool1", "$$this.v.bool2" ]
                            ]
                          }
                        }
                      }
                    ]
                  }
                }
              }
            ]
          }
        }
      }
    ]
  }
})

代码逻辑说明

  • $objectToArray: "$data groups":将动态键组成的"data groups"对象转为键值对数组,实现对group1、group2等动态分组的遍历。
  • 外层$reduce:遍历每个分组下的客户端条目,收集所有bool字段的判断结果。
  • $map:处理每个客户端条目里的data字段,同样用$objectToArray转换为数组,遍历subgroup76、subgroup77等动态子分组。
  • 内层$reduce:将每个子分组中的bool1、bool2值收集到数组中。
  • $anyElementTrue:只要数组内存在一个true,即判定该文档符合查询条件。

简化版本(MongoDB 5.0+支持)

如果你的MongoDB版本为5.0及以上,可使用$function自定义递归函数,代码可读性更强:

db.dbname.find({
  $expr: {
    $function: {
      body: function(doc) {
        function checkBool(obj) {
          if (typeof obj !== 'object' || obj === null) return false;
          if ('bool1' in obj && obj.bool1) return true;
          if ('bool2' in obj && obj.bool2) return true;
          for (let key in obj) {
            if (checkBool(obj[key])) return true;
          }
          return false;
        }
        return checkBool(doc['data groups']);
      },
      args: [ "$$ROOT" ],
      lang: "js"
    }
  }
})

该函数会递归遍历"data groups"下所有嵌套对象,只要找到任意bool1或bool2为true的字段,就返回true匹配文档。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:50:26