Я бы добавил немного избыточности в схему, чтобы избежать некоторых потенциальных проблем, о которых вы упомянули. Я предполагаю, что вы хотите 1) быстро подсчитать количество голосов и 2) убедиться, что пользователь не может голосовать дважды.
Один из способов добиться этого - сохранить как список пользователей, так и количество голосов, и добавить в запрос на обновление пункт, который гарантирует, что голос добавляется только в том случае, если идентификатор пользователя отсутствует в списке избирателей. :
var query = {_id: xyz, voters: {$ne: user_id}
var update = {$inc: {votes: 1}, $push: {voters: user_id}}
db.votes.update(query, update, true)
(последний параметр - upsert
, очень приятная особенность Mongo)
Затем, если вы хотите показать количество голосов, вы можете ограничить свойства результата до свойства votes
:
db.votes.find({_id: xyz}, {votes: true})
Полное описание того, что вы хотите сделать, вы можете найти здесь: http://cookbook.mongodb.org/patterns/votes/