无法发布/订阅Mongo聚合查询

时间:2015-05-16 16:49:59

标签: mongodb meteor aggregation-framework publish-subscribe iron-router

使用Meteor和Iron-Router,我正在尝试发布以下mongo查询(在服务器文件夹中):

Meteor.publish("getTestList", function() {
  return Tests.aggregate(
    [{
      $project : {
        "name" : 1,
        "description" : 1,
        "testNumber" : 1
      }
    }, {
      $sort : {
        "testNumber" : 1
      }
    }
  ])
});

请注意,我已在meteor mongo控制台工具中测试了此查询,并且在那里工作正常。 Tests也是

Tests = new Mongo.Collection("tests")

我正在订阅路由器,如下所示:

Router.route('/user', {

  waitOn: function() {
    // return [Meteor.subscribe("tests")];
    return [Meteor.subscribe("tests"),Meteor.subscribe("getTestList")];
  },

  action: function() {
    if (!this.ready()) {
      this.render('loading');
    }
    else {
      Session.set("testName", "blablabla")
      Session.set("submitted", false)
      this.layout('BasicLayout')
      this.render('UserPortal')
    }
  }
});

如果我导航到/ user,那么它永远不会通过加载...屏幕。控制台中没有错误,如果我只订阅tests而不订阅getTestList(即代码中注释掉的行),那么UserPortal模板会加载但是我收到控制台错误,指出Tests.aggregate不存在。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

Meteor尚不支持聚合。你可以这样工作:

添加聚合包:meteor add meteorhacks:aggregate

请改用Meteor.call / Meteor.methods,因为此时聚合结果是静态的。没有反应支持。

服务器端

Meteor.methods({
    "getTestList" : function() {
        return Tests.aggregate(
        [{
            $project : {
            "name" : 1,
            "description" : 1,
            "testNumber" : 1
          }
        }, {
          $sort : {
            "testNumber" : 1
          }
        }
      ])
    }
});

客户方:

您的模板

Template.xx.onCreated(function() {

    Meteor.call("getTestList", function(err, result) {
        Session.set("testlist", result);
    });
});

然后您可以通过查看Session.get("testlist");

来“反应性地”访问数据(当它准备就绪时)