Javascript MongoDB-使用聚合管道评论向上投票/向下投票
我正在尝试为评论实现一个向上/向下投票机制(类似于reddit上的向上/向下投票机制)。我有一个单独的集合,名为Javascript MongoDB-使用聚合管道评论向上投票/向下投票,javascript,database,mongodb,aggregation-framework,Javascript,Database,Mongodb,Aggregation Framework,我正在尝试为评论实现一个向上/向下投票机制(类似于reddit上的向上/向下投票机制)。我有一个单独的集合,名为commentReputation,其中的文档可以如下所示: { "_id" : ObjectId("5e5acb6d6034a879655c8819"), "commentId" : ObjectId("5e5983102328a83d1a4b541f"), "creationDate" : ISODate("2020-02-29T20:37:01.509Z"
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
文档就应该创建)
有两种情况:
x
创建我的第一个CommentReputation
文档。在项目的另一部分中,我将$setOnInsert
与{upsert:true}
一起使用,但是(查看文档)聚合管道目前似乎不支持$setOnInsert
。有没有别的办法解决这个问题upvoces
和downvoces
数组都不包含试图向上投票的userId
,因此它被添加到upvoces
数组中,而无需任何进一步操作
b) upvoces
数组包含试图对注释进行upvoces的userId
,因此应从upvoces
数组中删除userId
。(用户已对此评论进行了投票,并再次单击了取消投票的投票按钮)
c) downloves
数组包含userId
。在这种情况下,userId
应从downvoces
中删除,并添加到upvoces
updateOne
方法和aggreagtion管道来完成上述逻辑,但我不确定这是否可行
我当前拥有的是返回一个“无法识别的管道阶段名称:'$cond'”
我是不是想得太多了?我想1.
问题可以通过简单地创建一个CommentReputation
文档来解决(在创建注释
文档的同时,使用空的向上投票
和向下投票
)
有更好的方法吗?我希望它能在一个查询请求中工作。也许你们中的某个人实现了类似的功能,并可以在这方面给我一些提示。您可以通过以下管道更新来完成,但它要求存在upvotes和downvotes数组。即使它只是空的
var comment_id=ObjectId(“5E59833102328A83D1A4B541F”);
var user_id=ObjectId(“5E59833102328A83D1A4B53E5”);
db.commentReputation.update(
{
commentId:comment\u id
},
[
{
$set:{
向上投票:{
$cond:[
{$in:[user_id,$upvowers']},
{$setDifference:['$upVoces',[user_id]]},
{$setUnion:['$upvowers',[user_id]]}
]
}
}
},
{
$set:{
反对票:{
$cond:[
{$in:[用户id,$DOWNDOVERS']},
{$setDifference:['$downvotes',[user_id]]},
“$downpows”
]
}
}
}
]
);
谢谢!这非常有效!我将解决问题中描述的所需arays部分-每次创建注释时都创建它们:)@L3M0L或者,您可以在此之前执行批量写入和批量更新另一个操作,检查数组是否存在,如果不存在,则添加它们。
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])