这取决于您的应用程序,但您可能会向发布者发送一个非空字符串,发布者使用该字符串在用户集合中搜索匹配的名称。例如:
Meteor.publish('usersByName', function(search) {
check(search, String);
// make sure the user is logged in and that search is sufficiently long
if (!(this.userId && search.length > 2))
return [];
// search by case insensitive regular expression
var selector = {username: new RegExp(search, 'i')};
// only publish the necessary fields
var options = {fields: {username: 1}};
return Meteor.users.find(selector, options);
});
另请参阅为什么我们限制字段的常见错误。
表现
Meteor 足够聪明,可以跟踪每个客户为每个发布者拥有的当前文档集。当发布者重新运行时,它知道只发送集合之间的差异。所以你上面描述的情况已经为你处理好了。
- 如果您订阅了用户:1,2,3
- 然后您重新启动了用户 2、3、4 的订阅
- 服务器将为
removed
1 发送一条消息,为 4 发送一条添加消息。
请注意,如果您在重新运行订阅之前停止订阅,则不会发生这种情况。
removed
据我所知,在修改单个订阅的参数时没有办法避免消息。我可以想到两种可能(但很棘手)的替代方案:
累积所有先前搜索查询的交集并在订阅时使用它。例如,如果用户搜索{height: 5}
然后搜索{eyes: 'blue'}
您,则可以使用 订阅{height: 5, eyes: 'blue'}
。这可能很难在客户端上实现,但它应该以最少的网络流量完成您想要的。
累积活跃订阅。而不是每次用户修改搜索时都修改现有订阅,而是为新的文档集启动新订阅,并将订阅句柄推送到数组。当模板被销毁时,您需要遍历所有句柄并调用stop()
它们。这应该可行,但会消耗更多资源(网络和服务器内存+ CPU)。
在尝试这些解决方案之前,我建议在不使用它们的情况下对最坏的情况进行基准测试。我主要担心的是,如果没有相当严格的控制,您最终可能会在连续搜索后发布整个用户集合。