0

我阅读了使用原子运算符投票的文章。在本文中,该voters字段是一个ObjectIds 数组。但我想将其存储voters为具有以下格式的嵌入文档数组:

{
  user: ObjectId,
  date: Date,
  isDownvote: Boolean,  // If false, it's an upvote.
}

用户可以像 Stack Overflow 提供的投票系统一样对帖子投赞成票或反对票。因此,例如,当用户想要对帖子进行投票时,需要考虑以下情况:

  • 如果用户的反对票已经存在,则将投票更新isDownvotefalse
  • isDownvoteElse 用being推一个新的投票false

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

4

2 回答 2

1

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

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

如前所述,没有upsert子文档,所以这种作弊并删除旧票并重新写入。该date字段应该仍然可以,因为如果用户再次投票,那么该date字段应该更改为用户上次投票的时间,所以在我看来,这部分是有道理的。

于 2013-06-26T08:11:11.673 回答
1
$push : { voters : {
  user: ObjectId,
  date: Date
}}
于 2013-06-26T04:13:50.823 回答