2010-07-01 1 views
4

Я совершенно не знаком с Mongo и RoR, исходя из фона PHP.Изучение RoR и Mongo, почему бы не посчитать массив для голосов

Я как раз собирался через этот учебник по моделированию данных http://www.mongodb.org/display/DOCS/MongoDB+Data+Modeling+and+Rails

и был поражен с вопросом о том, почему учебник рекомендовал бы хранить голоса в поле и обновления, что поле

 
db.stories.update({_id: story_id, voters: {'$ne': user_id}}, 
    {'$inc': {votes: 1}, '$push': {voters: user_id}}); 
вместо просто

 
db.stories.update({_id: story_id, voters: {'$ne': user_id}}, 
    {'$push': {voters: user_id}}); 

, а затем счетом

Story.voters.count 
чтобы подсчитать количество пользователей, проголосовавших?

Я знаю, что это учебник, но это не похоже на самый эффективный способ управления данными.

+0

Yup. Ты прав. Используется для того, чтобы 'length' (attr, который вы ищете) не кэшировался, но теперь вы должны просто использовать это. –

ответ

1

Учебное пособие могло бы улучшить работу, объяснив цель сохранения поля кеша подсчета (голосов), поскольку это необходимо только в том случае, если вы намерены делать запросы диапазона по размеру массива.

От the docs:

Вы не можете использовать $ размер, чтобы найти диапазон размеров (например: массивы с более чем 1 элемент). Если вам нужен запрос для диапазона, создайте дополнительное поле размера , которое вы увеличиваете при добавлении .

В будущем нам, вероятно, не придется этого делать, поскольку возможности запроса продолжают расти. См. Билет JIRA SERVER-478.