如何在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
相关产品推荐
相关产品推荐

