我想在Meteor中创建一个消息传递应用程序(使用auth分支)。它有一个Messages集合,其中每个文档都有一个回复文档数组(“回复”)。在侧边栏中,我们有不同的消息集合视图,其中每个视图都有一个“查询”字段,该字段作为Meteor.publish('messages')...方法的参数提供。
到目前为止一切顺利。如果单击视图,页面的主要部分将显示与查询匹配的消息列表。对于每条消息,如果有任何回复比当前用户最后一次打开消息时更新,或者她从未打开过消息,则以粗体显示。我通过为每条消息维护一个“read_by”字段来完成此操作,该字段包含{user_id,...,read_at:...}数组的记录。这也非常有效。
问题在于我需要侧边栏中的每个视图显示一个徽章,其中包含每个视图的未读消息数(根据上一段中的逻辑),而不仅仅是当前选定的消息。
我该如何解决这个问题?据我所知,这意味着我需要针对Messages集合维护一些实时查询。同时,客户端不能选择订阅整个Messages集合 - 让我们假设它拥有数百万个文档。无论服务器上的DB集合中有多少文档,客户端都必须保持活泼。
我怀疑这需要不同的架构设计(这不是问题),但我看不太清楚。
答案 0 :(得分:3)
我认为你有两种选择。
更简单的选项(可能不是最有效的选项)是订阅您感兴趣的所有不同查询:
_.each(queries, function(query) {
Meteor.subscribe('messages', query);
})
当您需要消息时,请使用相同的查询仅选择您感兴趣的消息:
Template.queryView.messages = function() {
return Messages.find(queries[Session.get('currentQueryNo')]);
}
显然,你可以做你需要的计数。
另一种选择是发布一个特殊的计数集合,这是手动设置的。首先,执行与文档的publishing部分中的counts-by-room
示例非常相似的内容,然后在客户端执行以下操作:
var Counts = new Meteor.Collection('counts');
_.each(queries, function(query) {
Meteor.subscribe('counts-by-query', query);
})
counts-by-query
的每次订阅都会在计数集合中保留一条记录。
希望有所帮助!