Sembra molto più semplice utilizzare il secondo schema.
Document: { name: "name",
upvoters: [name1, name2, etc],
downvoters: [name1, name2, etc],
}
Per ottenere i voti totali puoi ottenere doc e usedoc.upvoters.length-doc.downvoters.length (inizia ogni documento con gli array di voti positivi e negativi che sono [ ])
Per registrare qualsiasi voto positivo dell'utente "x" sull'elemento "c" basta fare:
db.votes.update({name:"c"},{$addToSet:{upvotes:"x"},$pull:{downvotes:"x"}})
Questo è atomico e ha il vantaggio di fare la stessa cosa anche se lo esegui 10 volte. Ti evita anche di dover controllare se "x" ha già votato per "c" e in che modo.
Per registrare il downvote è sufficiente invertirlo:
db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})