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

如何编写MongoDB查询,按过滤后的JSON对象数组长度返回文档

正确查询方案

你可以通过$expr搭配数组操作符直接实现需求,无需额外聚合阶段,将语句中的X替换为你需要的过滤后数组长度即可:

{
  "$expr": {
    "$eq": [
      {
        "$size": {
          "$filter": {
            "input": "$arrayProperty",
            "cond": { "$ne": ["$$this.turbo", "nil"] }
          }
        }
      },
      X
    ]
  }
}

逻辑说明

  • $filter 遍历arrayProperty数组,仅保留turbo字段值不等于nil的元素
  • $size 统计过滤后数组的长度
  • $expr 支持在普通查询语句中使用聚合操作符,对比过滤后的数组长度和目标值X

如果需要兼容更低版本的MongoDB,也可以使用完整聚合管道实现:

db.collection.aggregate([
  // 新增临时字段存储过滤后的数组
  {
    "$addFields": {
      "filteredArray": {
        "$filter": {
          "input": "$arrayProperty",
          "cond": { "$ne": ["$$this.turbo", "nil"] }
        }
      }
    }
  },
  // 匹配过滤后长度符合要求的文档
  {
    "$match": {
      "filteredArray": { "$size": X }
    }
  },
  // 可选:移除临时字段,返回原始文档结构
  {
    "$project": {
      "filteredArray": 0
    }
  }
])

之前写法失效的原因

你尝试的$ne写法无法生效,是因为$ne作用于数组字段时,只会判断整个数组是否完全不等于指定的对象/值,不会遍历数组元素校验内部字段,自然无法实现过滤数组内部元素的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:45:03