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

MongoDB如何通过聚合统计键值数量并筛选数组长度符合要求的文档

实现方法

针对你的筛选需求,有两种可落地的实现方式,可根据实际场景选择:

简单查询实现

如果只是需要匹配数组长度完全固定的文档,不需要走聚合流程,直接用MongoDB内置的$size操作符就能完成筛选:

db.Fruits.find(
  // 匹配type数组长度恰好为2的文档
  { type: { $size: 2 } },
  // 投影规则:仅返回name字段,过滤掉默认携带的_id字段
  { name: 1, _id: 0 }
)

执行后返回的结果为:

[
  { "name": "apple" },
  { "name": "grape" }
]

聚合管道实现

如果是为了练习指定键的聚合操作逻辑,用聚合管道可以实现完全相同的效果,核心流程是先做文档匹配,再做字段投影输出:

db.Fruits.aggregate([
  // 第一阶段:筛选type数组长度为2的文档,匹配逻辑和普通查询一致
  {
    $match: {
      type: { $size: 2 }
    }
  },
  // 第二阶段:字段投影,仅保留需要返回的name字段
  {
    $project: {
      name: 1,
      _id: 0
    }
  }
])

补充说明

$size 仅支持匹配固定长度的数组,如果后续需要做数组长度的范围筛选(比如筛数组长度大于1的文档),就需要通过聚合临时计算数组长度字段,再做条件匹配,示例参考:

db.Fruits.aggregate([
  // 第一步:为每个文档临时计算type数组的长度,存入自定义字段
  {
    $addFields: {
      typeArrayLength: { $size: "$type" }
    }
  },
  // 第二步:基于计算出的长度字段做范围匹配
  {
    $match: {
      typeArrayLength: { $gt: 1 }
    }
  },
  // 第三步:清理临时计算字段和_id,仅返回需要的name
  {
    $project: {
      name: 1,
      _id: 0,
      typeArrayLength: 0
    }
  }
])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 10:15:04