【问题标题】:Subscription on large collection订阅大型收藏
【发布时间】:2014-10-29 03:33:49
【问题描述】:

我有一个最近变得非常大的收藏。我曾经订阅它的所有文档,并使用 myapp 中的搜索字段对其执行搜索。

对于这个更大的集合,加载需要很长时间。

您有什么建议可以减少加载时间,但仍然对整个集合进行强力搜索?

我可以通过客户端订阅集合的一部分(执行我的搜索查询)吗?

我现在拥有的:

在我的路由器上:

waitOn: function(){
  return [Meteor.subscribe('files')];
},

在我的客户端上(点击搜索按钮时):

'click #search':function(e,context) {
  Session.set("keywords",$("#search_input").val());
}

模板

Template.filwsList.helpers({
  files_results: function () {
    var keywords = new RegExp(Session.get("keywords"), "i");
    var result = Files.find({$or:[{name:keywords},{description:keywords},{tags:keywords}]},{sort: {updatedAt: 1}});
    return result;
  }
})

【问题讨论】:

  • 我问了一个您可能会觉得有用的类似主题的问题。 stackoverflow.com/questions/26225840/…。它列出了如何使用 pub/sub 或使用服务器方法搜索大型集合,并提供了这两种方法的示例。

标签: javascript meteor publish-subscribe


【解决方案1】:

解决方案是在服务器上定义一个publish function,将搜索关键字作为参数。

Meteor.publish('files', function publishFunction(keywords) {
  check(keywords, String);  // https://docs.meteor.com/#/full/check_package
  return Files.find({
    $or: [
      { name: keywords },
      { description: keywords },
      { tags: keywords }
    ]}, {
      sort: ...
      limit: ...
      fields: ...
    }
  ); 
});

然后在客户端,将keywords作为参数传递:

waitOn: function () {
  return Meteor.subscribe('files', keywords);
}

还值得注意的是,可能已经有一些软件包在做你想做的事情,例如autocompletedatatables

另请参阅了解 Meteor 发布/订阅。

【讨论】:

  • 为了安全(和社区意识),我建议在使用发布功能回答问题时始终包括输入检查。
  • 每次客户端订阅时都会调用发布函数。在这种情况下,发布发生在路线上,我猜是搜索表单所在的页面。当调用路由代码时 - 以及发布函数 - 关键字对象仍然为空(用户尚未键入关键字)......然后搜索将使用 underfined 作为 $ 或参数......
【解决方案2】:

您应该尝试发布尽可能少的数据。

仅发布(和订阅)在搜索中使用的集合字段(参见 http://docs.meteor.com/#find )并编写一个方法,通过 id 返回整个 File 对象并在搜索后调用它(当您正在显示文件内容或其他内容)。

其他选项,您可以只在服务器端进行搜索,而不发布 Files 集合,但结果不会太“流星”...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2016-08-13
    • 1970-01-01
    • 2015-10-15
    相关资源
    最近更新 更多