2017-08-26 54 views
1

我有一个角度流星应用程序,需要使用53,296个文档与angularUtils.directives.dirPagination之间的材质md-autocomplete,但此数据量会使我的浏览器挂起。来自海量数据的流星角度自动完成

我发布的收集与:

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

,但它需要很长的时间负载和它的铬停止工作。

+0

也许分页在服务器上?所以你只会发送你从服务器上显示的信息?另外,也许可以肯定的是,当搜索为空时,不要将所有结果都发回 – Urigo

+0

通常在大集合上自动完成时,您在服务器上执行搜索并仅返回匹配记录。将所有数据发布到客户端将会很慢。您可以将发布的字段数量限制为仅自动完成的字段数量。 –

+0

感谢分享想法实际上现在分页有助于不打破浏览器,但它需要时间来加载所有数据,但@MichelFloyd我真的不知道如何在服务器上搜索。 意思是,虽然我听说onReady,但我不能做到这一点,因为我有1页加载我想加载页面之前的数据。 你能帮我找到这两个关于onReady和搜索服务器的信息吗? 在此先感谢 –

回答

0

您已经完成了大部分服务器端搜索,因为您的搜索正在订阅中运行。您应该确保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. 将搜索限制为每500ms只运行一次,以免发送每个字符到服务器,因为必须重新执行搜索。如果用户输入的速度很快,那么搜索可能只会运行每2或3个字符。
  3. 在您运行在服务器上的客户端上运行相同的.find()(而不是仅查询{})。这是一个很好的做法,因为客户端集合是该集合上所有订阅的联合,那里可能有文档,您不想列出。

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

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

只有那些Meteor.subscribe('city')调用之一是必要的。

+0

亲爱的@Michel弗洛伊德感谢您的回复和抱歉错误问题我改变公众作为您的建议,并改为500毫秒和最少3个字符和广告索引 'if(Meteor.isServer){ City。_ensureIndex({city_name:1}); }' 并添加架构图: 'City = new Mongo.Collection('city'); var Schemas = {}; Schemas.City =新SimpleSchema({ CITY_NAME:{ 类型:字符串 }' 和正则表达式来助手,但没有返回到客户端和'City.find()取()'返回空数组 再次对不起。为我的newby错误 –

+0

请参阅MODS正则表达式使用,mongodb是有点特别的。 –