Mongoose lookup关联User与UserBmi表所有用户返回同条记录问题排查
问题原因
你的聚合查询中$lookup的关联字段配置完全错误,是所有用户都匹配到同一条BMI记录的核心原因,具体错误有2处:
- 变量定义错误:你在
let中写的{"uid": "user_id"}是把uid赋值为固定字符串user_id,而非取当前User表的主键_id的值。 - 关联匹配逻辑写反:你配置的匹配规则是对比固定字符串
user_id和BMI表不存在的id字段,完全不符合两个表的关联逻辑,正确关联逻辑应为User表的_id = BMI表的user_id。
由于你的匹配条件逻辑错误,会被判定为所有BMI记录都满足匹配规则,再加上$limit: 1的限制,所有用户都会返回整个BMI表按时间倒序后的第一条记录,也就是你看到的属于用户608915308462c0ccec435a97的那条数据。
修正后的查询代码
const users = await User.aggregate([ { $lookup: { from: "userbmis", // 正确定义变量:取当前User文档的主键_id赋值给uid let: { "uid": "$_id" }, pipeline: [ // 正确匹配:BMI表的关联字段user_id等于传入的用户_id { $match: { $expr: { $eq: ["$user_id", "$$uid"] } } }, { $sort: { "date": -1 } }, { $limit: 1 } ], as: "userbmis" } }, // 可选配置:如果要把返回的数组合并为单个对象,无BMI记录时返回null,可添加以下步骤 { $addFields: { latestBmi: { $first: "$userbmis" } } } ])
修正后未上传过BMI记录的用户,对应的userbmis字段会返回空数组,符合你的需求。
内容的提问来源于stack exchange,提问作者Napoleon Wai Lun Wong
相关产品推荐
相关产品推荐

