0

この質問は、次の質問に関連しています: MongoDB を使用した単純な投票システム

ユーザーが賛成票または反対票を投じることができるアイテムのコレクションがあります。どうすればいくつかのアイテムを取得でき、同時に投票したか投票したかを知ることができるのだろうか。

アイテム コレクションには、多かれ少なかれ次のようなアイテムが含まれています。

{
  _id:0,
  name:'Item 0',
  upVoters: [ 1, 2 ],
  downVoters: [ 3, 4 ]
}
{
  _id:1,
  name:'Item 1',
  upVoters: [ 1, 3 ],
  downVoters: [ 4 ]
}
{
  _id:2,
  name:'Item 2',
  upVoters: [ ],
  downVoters: [ 2 ]
}

つまり、たとえば、アイテム 0 は ID 1 と 2 のユーザーによって賛成票が投じられ、ユーザー 3 と 4 によって反対票が投じられたことを意味します。

私がユーザー 2 でそれらのアイテムを取得した場合、アイテム 0 に賛成票を投じ、アイテム 1 には投票せず、アイテム 2 に反対票を投じたことを知りたいと思います。

そのクエリを実行するにはどうすればよいですか? 可能であれば、1 つのクエリだけで実行したいと考えています。集計を使用する必要があると思いますが、その方法が見つかりません。

ユーザー 2 の視点からアイテムを照会した場合の期待される結果:

{
  _id:0,
  name:'Item 0',
  user_vote: 1
}
{
  _id:1,
  name:'Item 1',
  user_vote: 0
}
{
  _id:2,
  name:'Item 2',
  user_vote: -1
}

助けになれば、コレクションの形を変えることができます。たとえば、上記のリンク先の質問で提案されているモデルと同様のモデルを使用できます。

代替モデル:

{
  _id:0,
  name:'Item 0',
  voters: [
    { id:1, vote:+1}, { id:2, vote:+1},
    { id:3, vote:-1}, { id:4, vote:-1}
  ]
}
{
  _id:1,
  name:'Item 1',
  voters: [
    { id:1, vote:+1}, { id:3, vote:+1},
    { id:4, vote:-1}
  ]
}
{
  _id:2,
  name:'Item 2',
  voters: [
    { id:2, vote:-1}
  ]
}

どうもありがとうございました

-- フェラン

編集:

コメントで述べているように、これまでに見つけた解決策は、3 つのクエリを送信することです。

ユーザーのアイテムと投票を取得するための暫定的なソリューション

db.items.find({ upVoters:USER_ID })
db.items.find({ downVoters:USER_ID })
db.items.find({ upVoters:{$ne:USER_ID}, downVoters:{$ne:USER_ID} })
4

2 に答える 2