2014-10-13 3 views
0

У меня есть две коллекции Проблемы & Симуляторы:Метеор реактивная фильтрация опубликованной коллекции

// Issues 
{ 
    issueId: 1000, 
    appears: '2014-01-01', 
    ... 
} 
// Simulations 
{ 
    history: [50,200,30], 
    date: '2014-01-01', 
    .. 
} 

Как вновь активно публиковать вопросы, которые не в одном моделировании.

Meteor.publish('issues', function() { 
    var simulation = Simulations.findOne({}), 
     history = lodash.pluck(simulation.history, 'issueId'); 
    return Issues.find({ 
     issueId: {$nin: history}, 
     appears: {$lte: simulation.date} 
    }, {limit: 12}); 
}); 

Когда я вношу изменения в симуляцию даты или нажмите кнопку ввода-вывода в историю моделирования, я хочу, чтобы опубликованные данные изменились. Я обнаружил, что какой-то пакет публикуется с отношениями, но мне трудно понять, как его использовать, и это то, что мне действительно нужно. https://atmospherejs.com/cottz/publish-with-relations

ответ

1

Ваша функция публикации будет не работать реактивно по параметрам. Я имею в виду, что после того, как курсор был возвращен функцией публикации, изменения в наборе записей, возвращаемые , будут синхронизированы с запросом с клиентом, но изменений в запросе не будет иметь никакого эффекта. Поэтому, если вы хотите добавить еще один документ в коллекцию Issues, которая соответствует запросу {issueId: {$nin: originalHistory}, appears: {$lte: originalSimulation.date}}, он будет отправлен клиенту, но если вы внесете изменения в коллекцию Simulations, это не будет иметь никакого эффекта, поскольку курсор уже был возвращен функцией публикации.

Один из способов достижения того, на что вы нацеливаетесь, - подписаться на публикацию в блоке автозапуска и передать реактивные параметры, которые вы можете обновить по мере необходимости. Сохранение подписки в блоке автозапуска не только приведет к повторному повторному запуску, но и автоматически отменит старые подписки, чтобы вы не постоянно увеличивали нагрузку на сервер. Что-то вроде этого:

сервер:

Meteor.publish('issues', function (simulation, history) { 
    return Issues.find({ 
     issueId: {$nin: history}, 
     appears: {$lte: simulation.date} 
    }, {limit: 12}); 
}); 

клиент:

Tracker.autorun(function() { 
    var simulation = Simulations.findOne({}), 
     history = lodash.pluck(simulation.history, 'issueId'); 
    Meteor.subscribe('issues', simulation, history); 
}); 

Обратите внимание, что существуют способы, вы можете достичь этого только на сервере, путем наблюдения изменений и использования публикаций низкого уровня API. Подробнее о том, как вы могли это сделать here. Это почти наверняка более сложно сделать так, но может быть преимущество в производительности в зависимости от того, сколько вычислительных возможностей у вас есть на клиенте и сервере,

1

Я пробовал подход @richsilv, но в конце концов я закончил с использованием https://atmospherejs.com/mrt/reactive-publish Я не знаю, это правильный подход, но поскольку он автоматически работает, он будет делать пока.

Meteor.reactivePublish('issues', function() { 
    var simulation = Simulations.findOne({}, {reactive: true}), 
     history = lodash.pluck(simulation.history, 'issueId'); 
    return Issues.find({ 
     issueId: {$nin: history}, 
     appears: {$lte: simulation.date} 
    }, {limit: 12}); 
}); 
1

Вы можете использовать пакет reactive-publish (я - один из авторов). Это переписывание пакет упомянутой @ slobodan.blazeski:

Meteor.publish('issues', function() { 
    this.autorun(function (computation) { 
     var simulation = Simulations.findOne({}, {fields: {history: 1, date: 1}}), 
      history = lodash.pluck(simulation.history, 'issueId'); 
     return Issues.find({ 
      issueId: {$nin: history}, 
      appears: {$lte: simulation.date} 
     }, {limit: 12}); 
    }); 
}); 

Важно, что вы ограничиваете поля вы заинтересованы в документе моделирования, так что autorun не излишне повторно при изменении некоторых других областях.

+0

Пожалуйста, избегайте этого шаблона копировать/вставлять несколько ответов. Хотя вы адаптировали свой пост к каждому вопросу, это можно воспринимать как рыбный/спам. –

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