你建议的数据结构是完全合理的。无需过度考虑!
一个小小的复杂情况是,您可能必须手动管理您自己的observeChanges
为您推送userIds的数据库中的数组。这是因为流星出版物在$in
查询中没有反应,我假设你会用它来做类似db.users.find({_id: {$in: arrayOfUsersOnPage}})
的事情。
如果你想避免这种复杂性(我知道我这么做),那么你可以将这个信息直接去规范化到userDoc。当用户点击路线时,您可以将他们所在页面的唯一ID推送到他们的用户文档(如connectedPages
)上的阵列中。然后,您的页面只需要订阅:
db.users.find({connectedPages: '_id_of_this_page})
这是本机响应。
显然是的,你必须手动推/拉页面id到用户文件。在我看来,最简单的方法是在每个页面特定的模板事件和onDestroyed
期间。
匿名用户使用第二种实现方法变得有点棘手,因为他们没有用户文档进行非规范化处理。如果这是一项要求,我会首先为每个包含一组连接用户的页面创建一个文档。
当用户加载某个网页要实际检测,我会建议使用在大火中onCreated
钩或(显然)在作出反应ComponentDidMount
。阅读更多here。
要检测页面退出,我发现Meteor的出版物onStop
是可靠的。一个很好的讨论可以发现here。其他人会用一个简单的心跳做到这一点,我个人认为这是非流星,麻烦,但可靠。
关于如何唯一标识每个用户,显然那些登录的将有Meteor.userId()
。对于那些未登录的用户,您应该依赖仅可在服务器端使用的Meteor.connection._lastSessionId
。用这个连接用户列表更新你的页面文档服务器端,然后通过上面的讨论确保页面发布给所有连接的客户端,并且你应该有你需要的数据!
谢谢。你能否添加更多信息?你说我的想法是可行的:你可以编辑答案来解释当用户连接到特定页面时,我可能如何获得唯一的连接ID和用户信息?我已经看过'Meteor.onconnection',但我不能只在某个页面上调用它。 –
另外,如果我依赖'onCreated'和'onDestroyed',我不认为我可以解释当用户退出浏览器选项卡时的情况。我正在使用React,所以相当于'ComponentDidMount'和'ComponentWillUnmount',但同样的问题成立。 –
当然,请参阅上文。 – tyleha