gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:29:46 25 4
gpt4 key购买 nike

我正在尝试为评论实现一个 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 文档应该在有人赞成/反对评论后立即创建)

有两种情况:
  • 该集合是空的,这意味着我需要创建我的第一个 CommentReputation具有给定 commentId 的文档 x .在我使用的项目的其他部分 $setOnInsert{ upsert: true }但似乎(查看文档)聚合管道不支持 $setOnInsert就目前而言。有没有另一种方法来处理这个问题?
  • 该文件在那里,应该进行实际投票。

    a) 两者 upvotesdownvotes数组不包含 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 来解决文档(同时具有空 upvotesdownvotes,同时正在创建 Comment 文档。

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

    最佳答案

    您可以使用以下管道更新来完成,但它要求存在 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'
    ]
    }
    }
    }
    ]
    );

    关于javascript - MongoDB - 使用聚合管道评论赞成/反对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60469900/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com