Có vẻ đơn giản hơn nhiều khi sử dụng lược đồ thứ hai.
Document: { name: "name",
upvoters: [name1, name2, etc],
downvoters: [name1, name2, etc],
}
Để có được tổng số phiếu bầu, bạn có thể lấy doc và usedoc.upvoters.length-doc.downvoters.length (bắt đầu mỗi tài liệu với mảng số phiếu bầu ủng hộ và người bầu cử phản đối là [])
Để ghi lại bất kỳ ủng hộ nào của Người dùng "x" trên mục "c", chỉ cần thực hiện:
db.votes.update({name:"c"},{$addToSet:{upvotes:"x"},$pull:{downvotes:"x"}})
Đây là nguyên tử và nó có ưu điểm là làm được điều tương tự ngay cả khi bạn chạy nó 10 lần. Nó cũng giúp bạn không phải kiểm tra xem "x" đã bỏ phiếu cho "c" chưa và theo cách nào.
Để ghi lại phiếu phản đối, chỉ cần đảo ngược nó:
db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})