1

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

到目前为止,一切都很好。如果我单击视图,页面的主要部分会显示与查询匹配的消息列表。对于每条消息,如果有任何回复比当前用户上次打开消息时更新,或者她从未打开过消息,我会以粗体显示。为此,我为每条消息维护一个“read_by”字段,其中包含一组 {user_id, ..., read_at: ...} 记录。这也很有效。

问题是我需要侧边栏中的每个视图都显示一个带有每个视图的未读消息数量的徽章(根据上一段中的逻辑),而不仅仅是当前选择的一个。

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

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

4

1 回答 1

3

我认为你有两个选择。

更简单的选择(这可能不是最有效的)是订阅您感兴趣的所有不同查询:

 _.each(queries, function(query) {
   Meteor.subscribe('messages', query);
 })

当您需要消息时,使用相同的查询仅选择您感兴趣的消息:

 Template.queryView.messages = function() { 
   return Messages.find(queries[Session.get('currentQueryNo')]);
 }

显然,您可以进行所需的计数。

另一种选择是发布一个特殊的计数集合,它是手动设置的。首先,做一些与文档发布部分中的counts-by-room示例非常相似的事情,然后在客户端,做一些类似的事情:

 var Counts = new Meteor.Collection('counts');
 _.each(queries, function(query) {
   Meteor.subscribe('counts-by-query', query);
 })

每个订阅都counts-by-query将在计数集合中维护一条记录。

希望有帮助!

于 2012-10-06T00:16:14.030 回答