我有两个问题&模拟:
// 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});
});
当我更改模拟日期或将issueIds推送到模拟历史记录中时,我希望发布的数据发生变化。 我找到了一些关系发布的包,但我很难理解如何使用它,这是我真正需要的。 https://atmospherejs.com/cottz/publish-with-relations
答案 0 :(得分:1)
您的发布功能不对参数进行反应性运行。我的意思是,一旦游标被发布函数返回,对该查询返回的记录集的更改将与客户端同步,但更改为查询< / em>不会有任何影响。因此,如果您要将另一个文档添加到与{em>原始查询Issues
匹配的{issueId: {$nin: originalHistory}, appears: {$lte: originalSimulation.date}}
集合中,它将被发送到客户端,但是如果您对{更改{ {1}}集合它将无效,因为发布函数已经返回了游标。
实现目标的一种方法是在自动运行块中订阅发布,并传递可根据需要更新的反应参数。将订阅保留在自动运行块中不仅会使其重新运行,而且会自动取消旧订阅,这样您就不会不断增加服务器负载。像这样:
服务器:
Simulations
客户端:
Meteor.publish('issues', function (simulation, history) {
return Issues.find({
issueId: {$nin: history},
appears: {$lte: simulation.date}
}, {limit: 12});
});
请注意,您可以通过观察更改并使用低级发布API来在服务器上实现此目的。有关如何执行此操作的更多信息here。以这种方式执行操作几乎肯定会更复杂,但取决于客户端和服务器上可用的计算容量,可能会有性能优势,
答案 1 :(得分: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});
});
答案 2 :(得分: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
不会不必要地重新运行。