2017-08-26 10 views
1

私はangularUtils.directives.dirPaginationの53,296文書のコレクションからマテリアルmdオートコンプリートが必要ですが、このデータ量は私のブラウザをハングアップさせます。私はコレクションを公開しています巨大なデータからのメテオ角オートコンプリート

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

通常、大規模なコレクションの自動補完では、サーバー上で検索を実行し、一致するレコードのみを返します。すべてのデータをクライアントに公開するのは遅くなるでしょう。自動補完している1つのフィールドだけに、公開するフィールドの数を制限することができます。 –

+0

アイデアを共有してくれてありがとうございました。実際にページングの助けを借りてブラウザを壊さないようにしましたが、@MichelFloyd以外のすべてのデータをロードするのにかかる時間は本当にありません。 私はonReadyについて聞いている間、私はそれが起こることができませんが、私は1ページの読み込みのために私はページの負荷の前にデータをロードしたいと思います。 あなたはこれらの2つの参考にしてもらえますか? ありがとうございました –

答えて

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

私は何を見つけたことは、サーバー側のオートコンプリートに役立ちますは次のとおりです。ユーザーは3つのまたは4文字を入力するまで

  1. は、検索を開始しないでください。これにより、検索結果が大幅に絞り込まれます。
  2. すべての文字をサーバーに送信しないように、検索が500msごとに実行されるように絞り込みます。そのため、検索を再実行し続ける必要があるためです。人が速く入力している場合は、2〜3文字ごとに検索が実行されるだけです。
  3. {}を照会するのではなく、サーバーで実行しているクライアントで同じ.find()を実行します。クライアント側のコレクションはそのコレクションのすべてのサブスクリプションの集合であるため、これは単なる良い方法です。そこにはリストしたくないドキュメントがあるかもしれません。あなたは二度ここに加入している理由

は、最後に私は知らない:これらMeteor.subscribe('city')呼び出しの

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

一方だけが必要です。

+0

@Michel Floydさん、お返事ありがとうございます。誤字脱字をおかけして申し訳ありません。私はあなたの提案として公開を変更し、500文字以上の文字と広告インデックス 'if(Meteor.isServer){ Cityに変更してください。_ensureIndex({city_name:1}); } ' とスキーマを追加してください: ' City = new Mongo.Collection( 'city'); varスキーマ= {};ヘルパーが、クライアント側と 'City.find()に何も返すように文字列 }' と正規表現 '空の配列を返す)(フェッチ再び申し訳ありません : Schemas.City =新しいSimpleSchema({ CITY_NAME:{ タイプ。私のnewbyの間違いのために –

+0

正規表現を使用する正規表現を参照してください、mongodbはそれについてちょっとです。 –

関連する問題