繁体   English   中英

MongoDB - 使用聚合管道评论赞成/反对

[英]MongoDB - Comment Upvoting/Downvoting with Aggregation Pipeline

我正在尝试为评论实现一个 upvote/downvote 机制(类似于 reddit 上的 upvote/downvote 机制)。 我有一个名为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文档)

有两种情况:

  1. 该集合是空的,这意味着我需要使用给定的 commentId x创建我的第一个CommentReputation文档。 在项目的其他部分,我将$setOnInsert{ upsert: true }但似乎(查看文档)聚合管道目前不支持$setOnInsert 有没有另一种方法来处理这个问题?

  2. 该文件在那里,应该进行实际投票。

    a) upvotesdownvotes数组都不包含试图upvotesuserId ,因此它会被添加到upvotes数组中而无需任何进一步的操作

    b) upvotes数组包含试图对评论进行upvotesuserId ,因此应从upvotes数组中删除userId (用户已经对此评论进行了投票,并再次单击了取消投票的投票按钮)

    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文档来解决(在创建Comment文档的同时有空的upvotesdownvotes

有没有更好的方法来做到这一点? 我很想让它在单个查询请求中工作。 也许你们中的某个人实现了一个类似的功能,并且可以给我一些关于这个功能的提示。

您可以使用以下管道更新来完成,但它要求存在 upvotes 和 downvotes 数组。 即使它只是空的。

var comment_id = ObjectId("5e5983102328a83d1a4b541f");
var user_id = ObjectId("5e5983102328a83d1a4b53e5");

db.commentReputation.update(
    {
        commentId: comment_id
    },
    [
        {
            $set: {
                upvotes: {
                    $cond: [
                        { $in: [user_id, '$upvotes'] },
                        { $setDifference: ['$upvotes', [user_id]] },
                        { $setUnion: ['$upvotes', [user_id]] }
                    ]
                }
            }
        },
        {
            $set: {
                downvotes: {
                    $cond: [
                        { $in: [user_id, '$downvotes'] },
                        { $setDifference: ['$downvotes', [user_id]] },
                        '$downvotes'
                    ]
                }
            }
        }
    ]
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM