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

如何在MongoDB中获取聚合查询过滤后的数组长度

问题根因

你当前的写法中,$project阶段计算count时引用的$users是原始文档自带的未过滤数组,自然返回的是原数组总长度。另外MongoDB同一$project阶段内无法直接引用同阶段刚刚定义的新字段,所以不能直接对新生成的users字段计算长度。

解决方案

根据你需要的统计维度,可选择以下两种常用写法:

方案1:统计所有符合过滤条件的用户总数量(不受切片取前100条的限制)

拆分两个$project阶段,先暂存过滤后的完整数组,再分别做切片和长度统计:

db.FlaggedData.aggregate([
  {
    "$match": {
      "_id": "d86d6b48-e949-4daa-8364-9ef008416ae8"
    }
  },
  {
    "$project": {
      "filteredUsers": {
        "$filter": {
          "input": "$users",
          "as": "users",
          "cond": {
            "$and": [
              // 此处填写你的过滤条件
            ]
          }
        }
      }
    }
  },
  {
    "$project": {
      "users": { "$slice": ["$filteredUsers", 0, 100] },
      "count": { "$size": "$filteredUsers" }
    }
  }
])

该方案下,就算符合过滤条件的用户超过100条,count也会返回所有符合条件的总数量。

方案2:统计过滤且切片后最终返回的数组长度

如果只需要统计最终返回的100条以内的数组长度,可以用$let表达式在单个$project阶段完成,避免多次遍历数组:

db.FlaggedData.aggregate([
  {
    "$match": {
      "_id": "d86d6b48-e949-4daa-8364-9ef008416ae8"
    }
  },
  {
    "$project": {
      "users": {
        "$let": {
          "vars": {
            "filtered": {
              "$filter": {
                "input": "$users",
                "as": "users",
                "cond": { "$and": [ /* 你的过滤条件 */ ] }
              }
            }
          },
          "in": { "$slice": ["$$filtered", 0, 100] }
        }
      },
      "count": {
        "$size": {
          "$filter": {
            "input": "$users",
            "as": "users",
            "cond": { "$and": [ /* 和上方完全一致的过滤条件 */ ] }
          }
        }
      }
    }
  }
])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:15:03