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

如何在Mongoose中判断用户是否已点赞指定Product?

解决方案

原代码的问题

  • let字段定义错误:Product集合中没有productId字段,应该引用Product的主键(你写的Id,如果是MongoDB默认主键则为$_id)作为关联变量
  • 匹配条件逻辑颠倒:应该是likes集合的productId等于Product的主键,而非反过来
  • 缺少当前用户userId的匹配条件,无法精准判断当前用户是否点赞
  • 最终返回的hasLiked是数组类型,需要转换为布尔值

正确的聚合管道实现

假设你的Product集合主键是MongoDB默认的_id,当前用户的userId为"xxx"(根据实际业务传入),完整代码如下:

db.Product.aggregate([
  {
    $lookup: {
      from: "likes",
      let: { productId: "$_id" }, // 引用当前Product的_id作为关联变量
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                { $eq: ["$productId", "$$productId"] }, // 关联Product与likes的productId
                { $eq: ["$userId", "xxx"] } // 匹配当前用户的userId
              ]
            }
          }
        }
      ],
      as: "likedInfo"
    }
  },
  {
    $addFields: {
      hasLiked: { $ne: [{ $size: "$likedInfo" }, 0] } // 数组长度不为0则为true,否则为false
    }
  },
  {
    $project: {
      _id: 1,
      name: 1,
      description: 1,
      hasLiked: 1 // 只保留需要输出的字段
    }
  }
])

关键说明

  • 如果你的Product集合使用自定义主键Id而非默认_id,只需将let中的"$_id"改为"$Id"即可
  • userId的值需要根据实际业务场景传入(比如从登录状态中获取)
  • 通过$size判断lookup返回的数组长度,再用$ne转换为布尔值,得到最终的hasLiked字段

内容的提问来源于stack exchange,提问作者Sachin Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:25:36