Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 订购大量藏品_Javascript_Meteor_Publish Subscribe - Fatal编程技术网

Javascript 订购大量藏品

Javascript 订购大量藏品,javascript,meteor,publish-subscribe,Javascript,Meteor,Publish Subscribe,我有一个收藏,最近变得非常大。我曾经订阅过它的所有文档,当时我正在使用myapp中的搜索字段对它进行搜索 对于这个更大的集合,加载需要花费大量时间 您有什么建议可以缩短加载时间,但仍然可以对整个集合进行增强搜索 我可以通过客户端订阅集合的一部分(执行搜索查询)吗 我现在所拥有的: 在我的路由器上: waitOn: function(){ return [Meteor.subscribe('files')]; }, 在我的客户机上(单击搜索按钮时): 模板 Template.filwsLis

我有一个收藏,最近变得非常大。我曾经订阅过它的所有文档,当时我正在使用myapp中的搜索字段对它进行搜索

对于这个更大的集合,加载需要花费大量时间

您有什么建议可以缩短加载时间,但仍然可以对整个集合进行增强搜索

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

我现在所拥有的:

在我的路由器上:

waitOn: function(){
  return [Meteor.subscribe('files')];
},
在我的客户机上(单击搜索按钮时):

模板

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;
  }
})

解决方案是在服务器上定义一个以搜索关键字作为参数的

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: ...
    }
  ); 
});
然后在客户端上,将
关键字作为参数传递:

waitOn: function () {
  return Meteor.subscribe('files', keywords);
}
还值得注意的是,可能已经有包在做您想要做的事情,例如,或


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

您应该尽可能少地发布数据

仅发布(和订阅)搜索中使用的集合字段(请参见),并编写一个方法,按id返回整个
文件
对象,并在搜索后调用它(当显示文件内容或其他内容时)


另一种选择是,您可以只在服务器端进行搜索,而无需发布
文件
集合,但对于安全性(和社区意识),搜索结果不会太“流星般”…

,我建议在使用发布函数回答问题时始终包括输入检查。每次客户端订阅时都会调用发布函数。在本例中,发布发生在路由上,我猜这就是搜索表单所在的页面。当调用路由代码以及发布函数时,关键字对象仍然为空(用户尚未键入关键字)。。。然后搜索将使用罚款不足的$or param…我问了一个类似的问题,你可能会觉得有用。它列出了如何使用pub/sub或使用服务器方法搜索大型集合,并给出了两者的示例。
waitOn: function () {
  return Meteor.subscribe('files', keywords);
}