Изглежда много по-лесно да се използва втората схема.
Document: { name: "name",
upvoters: [name1, name2, etc],
downvoters: [name1, name2, etc],
}
За да получите общ брой гласове, можете да получите документа и useddoc.upvoters.length-doc.downvoters.length(започнете всеки документ с масиви за гласували за и против гласували [ ])
За да запишете всяко гласуване „за“ от потребител „x“ за елемент „c“, просто направете:
db.votes.update({name:"c"},{$addToSet:{upvotes:"x"},$pull:{downvotes:"x"}})
Това е атомарно и има предимството да прави едно и също нещо, дори ако го стартирате 10 пъти. Освен това ви спестява необходимостта да проверявате дали „x“ вече е гласувал за „c“ и по какъв начин.
За да запишете глас против, просто го обърнете:
db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})