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

MongoDB聚合:如何过滤对象并提取指定字段生成列表?

解决方案

你可以通过两种方式提取过滤后守门员对象的name字段,生成目标姓名列表:

方法一:单阶段完成过滤与映射

在现有的$project阶段中,用$map包裹$filter的结果,直接提取每个守门员的姓名:

[
  {
    $match: { name: "Team A" }
  },
  { 
    $project: {
      Players: {
        $map: {
          input: {
            $filter: {
              input: "$players",
              cond: { $eq: ["$$this.position", "Goalkeeper"] }
            }
          },
          as: "goalkeeper",
          in: "$$goalkeeper.name"
        }
      },
      _id: 0
    }
  }
]

说明

  • $filter先筛选出所有位置为守门员的球员对象
  • $map遍历筛选后的数组,将每个对象的name字段提取出来,组成新的姓名数组,最终命名为Players

方法二:分阶段处理

先通过$project得到过滤后的守门员对象数组,再新增一个$project阶段提取姓名:

[
  {
    $match: { name: "Team A" }
  },
  { 
    $project: {
       filteredPlayers: {
           $filter: {
               input: "$players",
               cond: { $eq: ["$$this.position", "Goalkeeper"] }
           }
        },
        _id: 0
    }
  },
  {
    $project: {
      Players: "$filteredPlayers.name",
      _id: 0
    }
  }
]

说明

  • 第一阶段的$project生成仅含守门员对象的filteredPlayers数组
  • 第二阶段利用MongoDB的数组字段特性:直接访问数组的子字段($filteredPlayers.name)会自动返回所有子字段值组成的数组,快速得到姓名列表

最终输出结果

两种方法都会返回符合你需求的格式:

{
  "Players": [ "Michael", "Mike" ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:55:38