publishing/subscribing Mongo 聚合查询出现问题

Trouble publishing/subscribing to a Mongo aggregate query

使用 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 不存在。

我做错了什么?

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");

来访问数据 'reactively'(准备就绪时)