MongoDB使用$lookup关联集合返回空值,如何计算车队平均速度?
问题原因
- 核心错误是聚合代码中所有引号使用了中文全角引号(
‘、“),MongoDB语法仅支持英文半角单/双引号,全角引号会被判定为非法标识符,导致$lookup的关联规则无法生效,最终关联结果返回空数组。 - MongoDB集合名大小写敏感,若实际集合名的大小写和$lookup中
from字段填写的集合名不完全一致,也会导致关联返回空。 - 你当前的代码仅完成了两集合关联,若要实现计算两支车队平均速度的最终需求,还需要补充展开关联结果、分组聚合的逻辑。
解决方案
1. 修复基础关联查询
将所有引号替换为英文半角引号,即可正常得到关联结果:
db.getCollection('Racers').aggregate([ { $lookup: { from: "Races", localField: "last_name", foreignField: "last_name", as: "Time" } } ])
2. 完整实现车队平均速度统计
以下是完整聚合逻辑,默认先统计车队平均比赛耗时,若需计算平均速度,可按注释说明替换公式即可:
db.getCollection('Racers').aggregate([ // 关联Races集合匹配对应选手的比赛数据 { $lookup: { from: "Races", localField: "last_name", foreignField: "last_name", as: "raceInfo" } }, // 展开关联得到的数组,方便后续聚合计算 { $unwind: "$raceInfo" }, // 按车队名称分组,统计平均数据 { $group: { _id: "$Team.Name", // 统计车队平均比赛耗时 avgOsakaTime: { $avg: "$raceInfo.Osaka_Time" }, // 若要计算平均速度,假设赛道固定长度为S,取消注释下方代码并替换S为实际长度即可 // avgSpeed: { $avg: { $divide: [S, "$raceInfo.Osaka_Time"] } }, // 可选:统计车队参赛人数 racerCount: { $sum: 1 } } } ])
执行后返回示例结果:
[ { "_id" : "Gowl", "avgOsakaTime" : 352.5, "racerCount" : 2 }, { "_id" : "Lion", "avgOsakaTime" : 353.5, "racerCount" : 2 } ]
内容的提问来源于stack exchange,提问作者NGT
相关产品推荐
相关产品推荐

