2017-08-26 73 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是有點特別的。 –