0

アトミック オペレーターによる投票の記事を読みました。この記事では、votersフィールドは の配列ですObjectIdvotersしかし、次の形式の埋め込みドキュメントの配列として保存したいと思います。

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

ユーザーは、Stack Overflow が提供する投票システムと同じように、投稿に賛成票または反対票を投じることができます。たとえば、ユーザーが投稿に賛成票を投じたい場合、次のようなケースを考慮する必要があります。

  • ユーザーによる反対票がすでに存在する場合は、投票を に更新isDownvotefalseます。
  • isDownvoteそれ以外の場合は、新しい投票をbeing でプッシュしfalseます。

この形式の投票を使用して、単一のクエリで投票をプッシュ/プルするにはどうすればよいですか?

4

2 に答える 2

1
$push : { voters : {
  user: ObjectId,
  date: Date
}}
于 2013-06-26T04:13:50.823 に答える
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 に答える