Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB-嵌入式版本,用于;使用原子运算符投票”;_Mongodb_Atomic_Voting - Fatal编程技术网

MongoDB-嵌入式版本,用于;使用原子运算符投票”;

MongoDB-嵌入式版本,用于;使用原子运算符投票”;,mongodb,atomic,voting,Mongodb,Atomic,Voting,我读了这篇文章。在本文中,投票者字段是ObjectIds的数组。但是我想将投票者存储为一个具有以下格式的嵌入式文档数组: { user: ObjectId, date: Date, isDownvote: Boolean, // If false, it's an upvote. } 用户可以像Stack Overflow提供的投票系统一样向上或向下投票帖子。因此,例如,当用户想要对帖子进行投票时,需要考虑以下情况: 如果用户的否决票已经存在,则将投票的isDownvote更新

我读了这篇文章。在本文中,
投票者
字段是
ObjectId
s的数组。但是我想将
投票者
存储为一个具有以下格式的嵌入式文档数组:

{
  user: ObjectId,
  date: Date,
  isDownvote: Boolean,  // If false, it's an upvote.
}
用户可以像Stack Overflow提供的投票系统一样向上或向下投票帖子。因此,例如,当用户想要对帖子进行投票时,需要考虑以下情况:

  • 如果用户的否决票已经存在,则将投票的
    isDownvote
    更新为
    false
  • 否则,在
    isDownvote
    false
    的情况下推送新投票

如何使用这种投票格式在单个查询中推/拉投票?

另一种完全原子化的方法是:

$push : { voters : {
  user: ObjectId,
  date: Date
}}
db.posts.update({'_id':post_id}, {
    '$pull': {'votes.user':ObjectId},
    '$addToSet': {votes: {
        user: objectId,
        date: Date,
        isdownvote: isdownvote
    }}
})

如前所述,子文档没有
upsert
,因此这种方法会欺骗并删除旧的投票并再次写入。
date
字段应该仍然可以,因为如果用户再次投票,那么
date
字段应该更改为用户最后一次投票的时间,所以在我看来这部分是有意义的。

对不起,我编辑了这个问题。我添加了一个新字段
isDownvote
。我也是。嵌入的文档没有
upsert
$addToSet
仅添加不存在的子文档,但不会更新存在的子文档。我还得出了类似的结论:)谢谢。这应该是答案。文章中的查询也会更新计数器,但我认为在这种情况下,单次查询无法实现这一点。@TrantorLiu-Hmm,没有人需要两次查询,即使在这种情况下,这也很糟糕