Tampaknya lebih mudah menggunakan skema kedua.
Document: { name: "name",
upvoters: [name1, name2, etc],
downvoters: [name1, name2, etc],
}
Untuk mendapatkan total suara, Anda bisa mendapatkan doc dan usedoc.upvoters.length-doc.downvoters.length(mulai setiap dokumen dengan array upvoters dan downvoters menjadi [ ])
Untuk merekam upvote oleh Pengguna "x" pada item "c" lakukan saja:
db.votes.update({name:"c"},{$addToSet:{upvotes:"x"},$pull:{downvotes:"x"}})
Ini adalah atomik dan memiliki keuntungan melakukan hal yang sama bahkan jika Anda menjalankannya 10 kali. Ini juga membuat Anda tidak perlu memeriksa apakah "x" sudah memilih "c" dan ke arah mana.
Untuk merekam downvote, balikkan saja:
db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})