Det virker meget enklere at bruge det andet skema.
Document: { name: "name",
upvoters: [name1, name2, etc],
downvoters: [name1, name2, etc],
}
For at få det samlede antal stemmer kan du hente dokumentet og usedoc.upvoters.length-doc.downvoters.length(start hvert dokument med op- og nedvælger-arrays som [ ])
For at optage en opstemme fra bruger "x" på punkt "c" skal du blot gøre:
db.votes.update({name:"c"},{$addToSet:{upvotes:"x"},$pull:{downvotes:"x"}})
Dette er atomært, og det har fordelen ved at gøre det samme, selvom du kører det 10 gange. Det sparer dig også for at skulle tjekke, om "x" allerede har stemt for "c", og hvilken vej.
For at optage nedstemning skal du bare vende det:
db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})