MongoDB聚合查询获取球员队友时results数组为空如何解决?
问题原因
$lookup子查询的匹配逻辑错误:你在子 pipeline 中直接用$eq判断$teams.years和$$team_year相等,但是文档结构里teams.years是数组类型,而$$team_year是你提前$unwind得到的单个年份数值,数组和单个数值直接做相等判断永远不会成立,所以没有匹配到任何结果。- 若不需要将查询的原球员本人计入队友列表,还需要额外加过滤条件排除原球员文档。
修改方案
把$lookup的子 pipeline 替换为筛选符合要求的球队记录即可,修改后的完整聚合语句如下:
db.Players.aggregate([ { $match: {_id: "/players/c/cruzne02.shtml"} }, {$unwind: "$teams"}, {$unwind: "$teams.years"}, { $lookup: { from: "Players", let: {team_name: "$teams.name", team_year: "$teams.years", original_player_id: "$_id"}, pipeline: [ { $match: { $expr: { $and: [ // 排除原球员本人,不需要的话可以删除这一行 {$ne: ["$_id", "$$original_player_id"]}, // 匹配存在对应球队+对应年份的球员 { $gt: [ { $size: { $filter: { input: "$teams", cond: { $and: [ {$eq: ["$$this.name", "$$team_name"]}, {$in: ["$$team_year", "$$this.years"]} ] } } } }, 0 ] } ] } } } ], as: "results" } }, {$unwind: {path: "$results", preserveNullAndEmptyArrays: true}}, { $group: { _id: {team: "$teams.name", year: "$teams.years"}, results: {$push: "$results"} } }, { $project: { team: "$_id.team", year: "$_id.year", results: 1, _id: 0 } } ]);
内容的提问来源于stack exchange,提问作者laneherby
相关产品推荐
相关产品推荐

