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,没有人需要两次查询,即使在这种情况下,这也很糟糕