2014-10-29 2 views
0

У меня есть коллекция, которая недавно стала очень большой. Я использовал для подписки на все его документы, я выполнял поиск по нему, используя поле поиска в myapp.Подписка на большую коллекцию

С этой большой коллекцией требуется загрузка времени.

Что бы вы посоветовали снизить время загрузки, но все же провести поиск мощности по всей коллекции?

Могу ли я подписаться на часть коллекции (выполняя мой поисковый запрос) через клиента?

, что у меня сейчас:

на маршрутизаторе:

waitOn: function(){ 
    return [Meteor.subscribe('files')]; 
}, 

на моем клиенте (если кнопка поиска нажата):

'click #search':function(e,context) { 
    Session.set("keywords",$("#search_input").val()); 
} 

шаблона

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

я задал вопрос по аналогичной теме, вы можете оказаться полезными. http://stackoverflow.com/questions/26225840/canonical-way-to-use-jqueryui-autocomplete-with-meteor. В нем перечислены способы поиска больших коллекций с использованием pub/sub или с использованием метода сервера с примерами для обоих. –

ответ

1

Решение состоит в том, чтобы определить publish function на сервере, который принимает в качестве параметра ключевое слово поиска.

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

Тогда на клиенте, передать keywords в качестве параметра:

waitOn: function() { 
    return Meteor.subscribe('files', keywords); 
} 

Стоит также отметить, что могут быть пакеты делать то, что вы хотите уже, например, autocomplete или datatables.

См. Также Понимание публикации Meteor/подписка.

+2

Для обеспечения безопасности (и осведомленности сообщества) я бы рекомендовал всегда включать проверки ввода при ответе на вопросы с функциями публикации. –

+0

Функция публикации вызывается каждый раз, когда клиент подписывается. В этом случае публикация происходит на маршруте, который, я думаю, является страницей, на которой находится форма поиска. Когда вызывается код маршрута - и поэтому функция публикации - объект ключевого слова по-прежнему пуст (пользователю еще не нужно вводить ключевые слова) ... тогда поиск будет использовать недофинансированный как $ или param ... – alexdown

+0

@DavidWeldon: обновлено , благодаря! –

0

Вам следует попытаться опубликовать как можно меньше данных.

Публикуйте (и подпишитесь) только поле коллекции, которое используется в поиске (см. http://docs.meteor.com/#find), и напишите метод, который возвращает весь объект File по идентификатору и вызывает его после вашего поиска (когда вы показываете содержимое файла или что-то еще).

Другой вариант, вы можете просто сделать поиск на стороне сервера, без публикации Files коллекции, но результат не будет много «Метеор-иш» ...

Смежные вопросы