流星发布中的反应性查询结果?

时间:2015-11-21 19:23:23

标签: mongodb meteor meteor-publications

本出版物的目标是发布团队已“解锁”并满足先决条件的问题。它工作正常,但是当团队解决其他问题时,该出版物不会被动地更新(添加到team.solved字段)。

我已经发现这是因为Teams.findOne({})的结果;查询不会被动反应,因此team.solved字段永远不会更改。是否有更好的设计允许它被动地更新,或者我是否必须将其更改为Teams.find()并使用.observeChanges()?

Meteor.publish("problems", function () {
    if(!this.userId) return [];
    var user = Meteor.users.findOne(this.userId);
    if(!user.profile.team) return [];
    var team = Teams.findOne({_id:user.profile.team});
    return Problems.find({requirements: {$not: {$elemMatch: {$nin: team.solved}}}});
});

如果我在这里使用任何不寻常的约定,请告诉我。

1 个答案:

答案 0 :(得分:0)

有一些不同的软件包设计可以解决这些类型的问题,reywood:publish-composite和peerlibrary:active-publish浮现在脑海中。

要使用peerlibrary执行此操作:被动发布,在语法上更简单的IMO,您只需将代码包装在自动运行中,如下所示:

Meteor.publish("problems", function () {
    this.autorun(function() {  

      if(!this.userId) return [];

      var user = Meteor.users.findOne(this.userId);

      if(!user.profile.team) return [];

      var team = Teams.findOne({_id:user.profile.team});

      return Problems.find({requirements: {$not: {$elemMatch: {$nin: team.solved}}}});

    });
});

https://atmospherejs.com/peerlibrary/reactive-publish