Javascript MongoDB-使用聚合管道评论向上投票/向下投票

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"

我正在尝试为评论实现一个向上/向下投票机制(类似于reddit上的向上/向下投票机制)。我有一个单独的集合,名为
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
    x
    创建我的第一个
    CommentReputation
    文档。在项目的另一部分中,我将
    $setOnInsert
    {upsert:true}
    一起使用,但是(查看文档)聚合管道目前似乎不支持
    $setOnInsert
    。有没有别的办法解决这个问题

  • 文件就在那里,应该进行实际的表决

    a)
    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])