2番目のスキーマを使用する方がはるかに簡単なようです。
Document: { name: "name",
upvoters: [name1, name2, etc],
downvoters: [name1, name2, etc],
}
総投票数を取得するには、ドキュメントとusedoc.upvoters.length-doc.downvoters.lengthを取得できます(各ドキュメントを賛成票と反対票の配列が[])で開始します
アイテム「c」のユーザー「x」による賛成票を記録するには、次のようにします。
db.votes.update({name:"c"},{$addToSet:{upvotes:"x"},$pull:{downvotes:"x"}})
これはアトミックであり、10回実行しても同じことを実行できるという利点があります。また、「x」がすでに「c」に投票したかどうか、およびその方法を確認する必要がありません。
反対票を記録するには、それを逆にします:
db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})