Метеор: возврат уникальных записей для фильтра списка

Привет, у меня есть простой фильтр, который позволяет пользователю фильтровать список сообщений на основе одного раскрывающегося списка каждого списка, который имеет связанный пост.

Другими словами, он позволяет фильтровать все посты со списком «Любимые места для выпивки в Уильямсбурге».

Однако я хочу, чтобы этот список отображался в раскрывающемся списке только один раз (сейчас он будет отображаться 3 раза, если, например, у него есть 3 сообщения, связанные с этим списком). Вот вспомогательная функция...

Template.userListsFilter.helpers({
  userlistsfilter: function() {
  var currentUser = Meteor.userId();
      return Posts.find({userId: currentUser, postlistid: { $exists : true }        },{sort:{postlistname:1} },{reactive:true});
  }
});

person cmee    schedule 17.12.2014    source источник


Ответы (1)


Если вы находитесь на клиенте, это можно сделать с помощью функции uniq из пакета подчеркивания. На сервере это можно сделать напрямую с помощью драйвера node mongo.

Я предполагаю, что уникальное поле postListName. Для клиента код может быть таким.

var query = Posts.find({userId: currentUser, postListId: { $exists : true }},{sort:{postListName:1} });
var postListNames = query.map( function( post ){ return post.postListName });  
postListNames = _.uniq( postListNames );
person user728291    schedule 18.12.2014
comment
Пробовал это, но теперь ничего не возвращает? Поле postlistname (все в нижнем регистре): - person cmee; 12.01.2015
comment
Я поместил фрагмент кода на jsfiddle - не мог вспомнить, как форматировать блоки кода в комментариях в stackoverflow. jsfiddle.net/cmeethree/atqppLwp - person cmee; 12.01.2015
comment
Были опечатки с именами переменных, иногда в camelCase. Демонстрация в meteorpad. - person user728291; 13.01.2015
comment
Ок круто спасибо посмотрю. На самом деле я исправляю более серьезную проблему в своем обновлении (поэтому я получаю ошибки, не запускается) с 0.9.3 до 1.0, поэтому, как только я это исправлю, я сделаю еще одну попытку. Надеюсь в ближайшие дни решится. - person cmee; 13.01.2015
comment
Хорошо, исправил мою проблему с обновлением. Поэтому, когда я попытался запустить в meteorpad, я получил сообщение об ошибке: «Ваше приложение падает». Вот последний журнал. /home/meteor/.meteor/packages/meteor-tool/.1.0.38.ieqxkv++os.linux.x86_64+web.browser+web.cordova/meteor-tool-os.linux.x86_64/dev_bundle/server- lib/node_modules/fibers/future.js:173 throw(ex); ^ TypeError: undefined не является функцией в /app/.meteor/local/build/programs/server/boot.js:182:5 Выход с кодом: 8 Ваше приложение аварийно завершает работу. Ожидание изменения файла. - person cmee; 14.01.2015
comment
Ошибка была вызвана оставлением Meteor.startup() без аргумента в коде сервера. Исправлено сейчас. - person user728291; 15.01.2015
comment
Хм, ладно, у меня почему-то все еще не работает. Даже это не работает: var query = Posts.find({userId: currentUser, postListId: { $exists : true }},{sort:{postlistname:1} }); return query; Я тоже поставил свой шаблон на скрипку... jsfiddle.net/cmeethree /atqppLwp - person cmee; 15.01.2015
comment
Ок, поиграл еще немного. Он также должен иметь реактивный: истинный. Вот окончательный код: var query = Posts.find({userId: currentUser, postlistid: { $exists : true } },{sort:{postlistname:1} },{reactive:true}).fetch(); return _.uniq(query, false, function(list) {return list.postlistname}); - person cmee; 15.01.2015
comment
Привет, не могли бы вы опубликовать код того, как выглядит ваш html-шаблон? Я считаю, что у меня работает фильтр уникальности, но теперь я не уверен, как вызвать конкретную переменную postListName в итерации html #each. - person Kyle Bachan; 02.02.2015