我正在尝试对评论实施upvote / downvote机制(类似于reddit上的upvoting / downvoting机制)。我有一个单独的集合,称为commentReputation
,里面的文档看起来像这样:
{
"_id" : ObjectId("5e5acb6d6034a879655c8819"),
"commentId" : ObjectId("5e5983102328a83d1a4b541f"),
"creationDate" : ISODate("2020-02-29T20:37:01.509Z"),
"upvotes" : [
ObjectId("5e5983102328a83d1a4b53e7"),
ObjectId("5e5983102328a83d1a4b53e4")
],
"downvotes" : [
ObjectId("5e5983102328a83d1a4b53e5")
]
}
简而言之:每个评论最终都将拥有其自己的CommentReputation
文档(一旦有人投票赞成/反对评论,就应该创建CommentReputation
文档)
有两种情况:
集合为空,这意味着我需要使用给定的commentId CommentReputation
创建我的第一个x
文档。在项目的其他部分中,我将$setOnInsert
与{ upsert: true }
结合使用,但(从文档中看)似乎聚合管道目前不支持$setOnInsert
。还有其他方法可以解决此问题吗?
文件在那里,应该进行实际的表决。
a)upvotes
和downvotes
数组均不包含试图升级的userId
,因此无需任何进一步操作即可将其添加到upvotes
数组中
b] upvotes
数组包含试图对注释进行投票的userId
,因此,应从userId
数组中删除upvotes
。 (用户已经对该评论进行了投票,并再次单击了取消投票按钮以取消该投票)
c)downvotes
数组包含userId
。在这种情况下,应从userId
中删除downvotes
并将其添加到upvotes
我正在尝试使用updateOne
方法和聚集管道来完成上述逻辑,但是我不确定这是否可能。
我目前拥有的是返回"Unrecognized pipeline stage name: '$cond'"
const updateUpvotes = {
$cond: {
if: { $elemMatch: { upvotes: ObjectID(userId) } },
then: { $pull: { upvotes: ObjectID(userId) } },
else: { $addToSet: { upvotes: ObjectID(userId) } }
}
};
db.collection(collectionName).updateOne({
commentId: ObjectID('5e5983102328a83d1a4b541f')
}, [updateUpvotes])
我是否过度考虑了整个功能?我猜想1.
问题可以通过简单地创建CommentReputation
文档来解决(同时创建upvotes
文档时使用空的downvotes
和Comment
。)
是否有更好的方法?我希望它可以在单个查询请求中运行。也许你们中的某人实现了类似的功能,并且可以给我一些提示。
我正在尝试对评论实施upvote / downvote机制(类似于reddit上的upvoting / downvoting机制)。我有一个单独的集合,称为commentReputation和...
您可以通过以下管道更新来完成此操作,但是它要求存在upvotes和downvotes数组。即使只是空的。