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

Mongoose lookup关联User与UserBmi表所有用户返回同条记录问题排查

问题原因

你的聚合查询中$lookup的关联字段配置完全错误,是所有用户都匹配到同一条BMI记录的核心原因,具体错误有2处:

  1. 变量定义错误:你在let中写的{"uid": "user_id"}是把uid赋值为固定字符串user_id,而非取当前User表的主键_id的值。
  2. 关联匹配逻辑写反:你配置的匹配规则是对比固定字符串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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:18:04