Где хранить общедоступное состояние пользователя в Meteor?

Предположим, у меня есть чаты как часть приложения Meteor, и внутри каждого чата пользователи должны видеть, кто еще находится в чате, а также количество пользователей во всех других чатах.

Где мне хранить чат, в котором находится каждый пользователь? Должно быть

  • в предоставленной коллекции Meteor.users в качестве свойства для каждого пользователя?
  • в коллекции Chatrooms в виде списка пользователей в каждом чате?
  • Как правильно денормализовать данные, чтобы пользователь мог видеть количество людей в других чатах, не отправляя также все эти пользовательские записи?

Связанный с этим вопрос: когда мне следует хранить вещи в Meteor.users(), а не в отдельной коллекции, содержащей документы с идентификаторами пользователей и комнат, например ChatroomParticipants? то есть:

{ user: "foo", room: "room 1" }
{ user: "bar", room: "room 2" }

Кроме того, есть ли способ настроить это так, чтобы пользователь мог входить в одно и то же приложение из нескольких окон и находиться в разных комнатах? То есть рендеринг для конкретного пользователя не зависит от какого-то глобального состояния, которое заставляет все меняться в сеансах.


person Andrew Mao    schedule 28.06.2013    source источник


Ответы (1)


В этом случае вы должны сделать так, чтобы это было записано в Meteor.users документе. Чем меньше вы централизуете чтение / запись только в одном документе, тем лучше, поэтому это не будет узким местом. Посмотрите, как метеор-присутствие делает это в расширенном использовании.

person gabrielhpugliese    schedule 28.06.2013
comment
Можете дать ссылку, почему хуже централизовать на одном документе? - person Andrew Mao; 28.06.2013
comment
Кроме того, есть ли разница между использованием Meteor.users и отдельной ChatroomParticipants коллекции, содержащей записи пользователей и соответствующих им чатов? - person Andrew Mao; 28.06.2013
comment
Я однажды видел видео / слайды Google, объясняющие, как вести блог в GAE Datastore (их масштабируемый NoSQL), но я не могу его найти. Второй вопрос: вы можете делать и то, и другое, но вам это не нужно. Будет сложнее узнать, где искать вещи, потому что у вас несколько коллекций. Представьте, что в будущем у вас будет еще 2 атрибута для пользователей. Собираетесь ли вы создать еще две отдельные коллекции? Надеюсь, это имеет смысл, потому что я не знаю, как это здесь объяснить. - person gabrielhpugliese; 28.06.2013
comment
Проблема в том, что если я сохраняю комнаты чата для каждого пользователя в коллекции пользователей, я не могу выполнить простой запрос, чтобы получить количество пользователей в каждой комнате чата. По крайней мере, это кажется довольно неэффективным по сравнению с индексированием пары полей в ChatroomParticipants. - person Andrew Mao; 28.06.2013
comment
Да, это правда. Может, лучше спросить об этом в Meteor-Talk или на IRC-канале. - person gabrielhpugliese; 28.06.2013