Wydaje się o wiele prostsze w użyciu drugiego schematu.
Document: { name: "name",
upvoters: [name1, name2, etc],
downvoters: [name1, name2, etc],
}
Aby uzyskać całkowitą liczbę głosów, możesz pobrać doc i usedoc.upvoters.length-doc.downvoters.length (zacznij każdy dokument od tablic upvoters i downvoters będących [ ])
Aby zarejestrować dowolny głos za użytkownika „x” na elemencie „c”, po prostu wykonaj:
db.votes.update({name:"c"},{$addToSet:{upvotes:"x"},$pull:{downvotes:"x"}})
To jest atomowe i ma tę zaletę, że robi to samo, nawet jeśli uruchomisz go 10 razy. Oszczędza to również konieczności sprawdzania, czy „x” już głosowało na „c” i w jaki sposób.
Aby zarejestrować głos przeciwny, po prostu odwróć go:
db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})