【问题标题】:Meteor-angular autocomplete from huge data来自海量数据的流星角自动完成
【发布时间】:2018-02-04 08:49:26
【问题描述】:

我有一个 angular-meteor 应用程序,它需要来自具有 53,296 个文档的集合中的 Material md-autocomplete,angularUtils.directives.dirPagination 但是这么多的数据使我的浏览器挂起。

我正在发布收藏:

Meteor.publish('city', function (options, searchString) {
  var where = {
    'city_name': {
      '$regex': '.*' + (searchString || '') + '.*' ,
      '$options': 'i'
    }
  };
  return City.find(where, options);
});

我订阅:

subscriptions: function () {
  Meteor.subscribe('city');
  this.register('city', Meteor.subscribe('city'));
}

并在控制器上进行分页:

$scope.currentPage = 1;
$scope.pageSize = 100;
$scope.sort = {city_name_sort : 1};
$scope.orderProperty = '1';
$scope.helpers({
  city: function(){
    return City.find({});
  }
});

但是加载需要很长时间,并且它使 chrome 停止工作。

【问题讨论】:

  • 可能在服务器上分页?所以你只会发送你从服务器显示的信息?另外,也许可以确定当搜索为空时,不要将所有结果都发回
  • 通常在大型集合上使用自动完成功能,您会在服务器上执行搜索并仅返回匹配的记录。将所有数据发布到客户端会很慢。您可以将要发布的字段数限制为仅自动完成的一个字段。
  • 感谢分享想法实际上现在分页有助于不破坏浏览器但加载所有数据需要时间但@MichelFloyd 我真的不知道如何在服务器上搜索。意思是当我听说 onReady 但我无法实现它,因为我有 1 页要加载我想在页面加载之前加载数据。你能帮我参考一下这两个:onReady & 在服务器上搜索吗?提前致谢

标签: meteor angular-meteor


【解决方案1】:

您已经完成了大部分服务器端搜索,因为您的搜索是在订阅中运行的。您应该确保 city_name 字段在 mongo 中被索引!您应该只返回该字段以最小化数据传输。您还可以简化您的正则表达式。

Meteor.publish('city', function (searchString) {
  const re = new RegExp(searchString,'i');
  const where = { city_name: { $regex: re }};
  return City.find(where, {sort: {city_name: 1}, fields: {city_name: 1}});
});

我发现有助于服务器端自动完成的是:

  1. 在用户输入 3 或 4 个字符之前不要开始搜索。这大大缩小了搜索结果的范围。
  2. 将搜索限制为每 500 毫秒运行一次,这样您就不会将每个字符都发送到服务器,因为它必须不断重新执行搜索。如果此人输入速度很快,则搜索可能仅每 2 或 3 个字符运行一次。
  3. 在您正在服务器上运行的客户端上运行相同的.find()(而不是仅仅查询{})。这是一个很好的做法,因为客户端集合是该集合上所有订阅的联合,那里可能有您不想列出的文档。

最后我不知道你为什么要在这里订阅两次:

subscriptions: function () {
  Meteor.subscribe('city');
  this.register('city', Meteor.subscribe('city'));
}

只需要其中一个Meteor.subscribe('city') 调用。

【讨论】:

  • 亲爱的@Michel Floyd 感谢您的回复,并对错字问题感到抱歉,我将根据您的建议更改为 500 毫秒和最少 3 个字符和广告索引 if ( Meteor.isServer ) { City._ensureIndex( { city_name: 1 } ); } 并添加架构:City = new Mongo.Collection('city'); var Schemas = {}; Schemas.City = new SimpleSchema({ city_name : { type: String } 和正则表达式助手,但没有返回客户端,City.find().fetch() 返回空数组。再次为我的新手错误感到抱歉
  • 查看要使用的正则表达式的模组,mongodb对此有点特别。
猜你喜欢
  • 2016-09-01
  • 2010-10-15
  • 2018-12-31
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 2013-11-25
相关资源
最近更新 更多