【发布时间】:2019-11-02 09:32:46
【问题描述】:
我正在尝试向我的网站添加 like 功能。我使用以下架构制作了一个 likes 集合。我正在使用自定义 _id 来避免创建额外的索引。
{
_id: {
postId: ObjectId,
userId: ObjectId
}
}
我的服务器上有一条使用 MongoDB 聚合 搜索帖子集合的路由。我正在尝试向当前管道添加一个 $lookup 阶段,以便添加一个 liked 属性,其类型为 Boolean 指示是否或用户未喜欢该帖子。这是不工作的 $lookup 阶段(liked 始终返回一个空数组,即使有相应的类似文档):
{
$lookup: {
from: 'likes',
let: { likedPostId: '$_id.postId', likerUserId: '$_id.userId' },
pipeline: [
{ $match:
{ $expr:
{ $and:
[
{ $eq: [
'$$likerUserId',
ObjectId('12345')
]},
{ $eq: [
'$$likedPostId',
'$_id'
]}
]
}
}
}
}
],
as: 'liked'
}
}
我认为问题在于 变量 实际上并没有保持我期望的值。有没有办法解决这个问题?另外,如果您知道实现此功能的更简单方法,如果您与我分享,我将不胜感激。
我尝试比较两个相同的 ObjectId() 实例,以确保可以使用 $eq 运算符比较 ObjectId 实例。还尝试在不同的嵌套字段上定义嵌套变量,就像上面代码 sn-p 中的变量一样。这个问题唯一不同的是我试图在 _id 字段之外提取属性。
附:我知道 liked 属性将是一个 Array 而不是 Boolean。但我正在考虑在下一阶段将其转换为 Boolean。但这不是现在的问题。
【问题讨论】:
-
我认为实现它的更简单方法是在您的帖子模型中添加一个喜欢的字段;这个喜欢的字段将是一组用户 ID。这样您就可以直接查询帖子是否被“点赞”以及被谁点赞。
-
@FranciscoMarão 我不同意,这种设计模式在大规模 imo 上非常糟糕。
-
另外@amiratak88 你的语法是正确的,你应该三重检查一个匹配是假设找到的。
-
@tomslabbaert 感谢您的评论。您能否详细说明一下,尤其是三重检查。
-
不多说,语法对。我只是仔细检查了我的本地并得到了匹配。这意味着我假设您要匹配的 ID 中的一个不相同。
标签: mongodb mongoose aggregation-framework lookup aggregation