Verkar mycket enklare att använda det andra schemat.
Document: { name: "name",
upvoters: [name1, name2, etc],
downvoters: [name1, name2, etc],
}
För att få totalt antal röster kan du hämta dokumentet och usedoc.upvoters.length-doc.downvoters.length(börja varje dokument med upp- och nedväljare som är [ ])
För att spela in en uppröstning av användare "x" på objekt "c" gör bara:
db.votes.update({name:"c"},{$addToSet:{upvotes:"x"},$pull:{downvotes:"x"}})
Det här är atomärt och det har fördelen att göra samma sak även om du kör det 10 gånger. Det besparar dig också från att behöva kontrollera om "x" redan har röstat för "c" och på vilket sätt.
För att spela in nedröstning, vänd bara om det:
db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})