Parece mucho más simple usar el segundo esquema.
Document: { name: "name",
upvoters: [name1, name2, etc],
downvoters: [name1, name2, etc],
}
Para obtener el total de votos, puede obtener el doc y usedoc.upvoters.length-doc.downvoters.length (comience cada documento con matrices de votantes positivos y negativos como [ ])
Para registrar cualquier voto a favor del usuario "x" en el elemento "c", simplemente haga lo siguiente:
db.votes.update({name:"c"},{$addToSet:{upvotes:"x"},$pull:{downvotes:"x"}})
Esto es atómico y tiene la ventaja de hacer lo mismo incluso si lo ejecuta 10 veces. También le evita tener que verificar si "x" ya votó por "c" y de qué manera.
Para registrar un voto negativo, inviértalo:
db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})