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
相关产品推荐
相关产品推荐

