Parece muito mais simples usar o segundo esquema.
Document: { name: "name",
upvoters: [name1, name2, etc],
downvoters: [name1, name2, etc],
}
Para obter o total de votos, você pode obter o doc e usedoc.upvoters.length-doc.downvoters.length (iniciar cada documento com os arrays upvoters e downvoters sendo [ ])
Para registrar qualquer upvote do usuário "x" no item "c" basta fazer:
db.votes.update({name:"c"},{$addToSet:{upvotes:"x"},$pull:{downvotes:"x"}})
Isso é atômico e tem a vantagem de fazer a mesma coisa mesmo se você executá-lo 10 vezes. Também poupa você de ter que verificar se "x" já votou em "c" e de que maneira.
Para gravar downvote basta inverter:
db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})