Ваша рекомендованная структура данных является вполне разумным. Нет необходимости переубеждать!
Одним из незначительных осложнений является то, что вам, возможно, придется вручную управлять своим собственным observeChanges
для массива в db, на который вы нажимаете userIds. Это потому, что публикации метеоров не реагируют на запрос $in
, который, как я полагаю, вы будете использовать, чтобы сделать что-то вроде db.users.find({_id: {$in: arrayOfUsersOnPage}})
.
Если вы хотите избежать этой сложности (я знаю, что знаю), вы можете денормализовать эту информацию непосредственно в userDoc. Когда пользователь набирает маршрут, вы можете нажать уникальный идентификатор страницы, на которой они находятся, на массив в своем пользовательском документе, например connectedPages
. Затем вашей странице просто нужно будет подписаться на:
db.users.find({connectedPages: '_id_of_this_page})
, который изначально реагирует.
Очевидно, что да, вы должны вручную нажать/вывести идентификатор страницы в пользовательский документ. Самый простой способ сделать это на мой взгляд будет в течение и onDestroyed
событий шаблона, характерных для каждой страницы.
Анонимные пользователи получают немного сложнее с этим вторым методом реализации, так как у них нет пользовательских документов для денормализации. Если это требование, я бы пошел с вашей первой идеей документа для каждой страницы, содержащей массив подключенных пользователей.
Чтобы действительно определить, когда пользователь загружает данную страницу, я предложил бы использовать onCreated
крюк в Blaze или (по-видимому) в ComponentDidMount
в React. Подробнее here.
Чтобы обнаружить выход страницы, я нашел публикацию Метеор onStop
, чтобы быть надежным. Хорошее обсуждение можно найти here.Другие могли бы сделать это с простым пульсом, которое я лично считаю очень не-Метеорным и громоздким, но надежным.
Относительно того, как однозначно идентифицировать каждого пользователя, очевидно, что вошедшие в систему будут иметь Meteor.userId()
. Для тех, кто не вошел в систему, вы должны полагаться на Meteor.connection._lastSessionId
, который доступен только на стороне сервера. Обновите сервер страницы на странице с этим списком подключенных пользователей, а затем убедитесь, что страница будет опубликована для всех подключенных клиентов через вышеперечисленное, и вы должны иметь нужные данные!
Спасибо. Не могли бы вы добавить дополнительную информацию? Вы сказали, что моя идея возможна: не могли ли вы отредактировать ответ, чтобы объяснить, как я могу получить уникальный идентификатор соединения и информацию о пользователе, когда пользователь подключается к определенной странице? Я посмотрел на «Meteor.onconnection», но я не могу назвать это только на определенной странице. –
Кроме того, если я полагаюсь на 'onCreated' и' onDestroyed', я не думаю, что могу объяснить ситуацию, когда пользователь покидает вкладку браузера. Я использую React, поэтому эквивалент будет «ComponentDidMount» и «ComponentWillUnmount», но тот же вопрос сохраняется. –
Несомненно, смотрите выше. – tyleha