流星:维护不同收集视图的实时计数

时间:2012-10-05 12:14:06

标签: mongodb meteor

我想在Meteor中创建一个消息传递应用程序(使用auth分支)。它有一个Messages集合,其中每个文档都有一个回复文档数组(“回复”)。在侧边栏中,我们有不同的消息集合视图,其中每个视图都有一个“查询”字段,该字段作为Meteor.publish('messages')...方法的参数提供。

到目前为止一切顺利。如果单击视图,页面的主要部分将显示与查询匹配的消息列表。对于每条消息,如果有任何回复比当前用户最后一次打开消息时更新,或者她从未打开过消息,则以粗体显示。我通过为每条消息维护一个“read_by”字段来完成此操作,该字段包含{user_id,...,read_at:...}数组的记录。这也非常有效。

问题在于我需要侧边栏中的每个视图显示一个徽章,其中包含每个视图的未读消息数(根据上一段中的逻辑),而不仅仅是当前选定的消息。

我该如何解决这个问题?据我所知,这意味着我需要针对Messages集合维护一些实时查询。同时,客户端不能选择订阅整个Messages集合 - 让我们假设它拥有数百万个文档。无论服务器上的DB集合中有多少文档,客户端都必须保持活泼。

我怀疑这需要不同的架构设计(这不是问题),但我看不太清楚。

1 个答案:

答案 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的每次订阅都会在计数集合中保留一条记录。

希望有所帮助!