Semble beaucoup plus simple d'utiliser le deuxième schéma.
Document: { name: "name",
upvoters: [name1, name2, etc],
downvoters: [name1, name2, etc],
}
Pour obtenir le nombre total de votes, vous pouvez obtenir le doc et useoc.upvoters.length-doc.downvoters.length (démarrez chaque document avec les tableaux upvoters et downvoters étant [ ])
Pour enregistrer tout vote positif de l'utilisateur "x" sur l'élément "c", faites simplement :
db.votes.update({name:"c"},{$addToSet:{upvotes:"x"},$pull:{downvotes:"x"}})
C'est atomique et ça a l'avantage de faire la même chose même si vous l'exécutez 10 fois. Cela vous évite aussi d'avoir à vérifier si "x" a déjà voté pour "c" et dans quel sens.
Pour enregistrer un vote négatif, il suffit de l'inverser :
db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})