如何在meteor中访问客户端上的服务器聚合

时间:2018-03-29 02:37:24

标签: meteor

一个菜鸟问题。我在服务器上使用meteor-native-mongo来访问MongoDB中的聚合函数,但是,我不确定如何返回并访问客户端的结果。在过去,使用collection.find({})函数订阅然后访问客户端上的集合非常简单,但是,我不知道如何使用集合函数来完成它。有人可以解释一下。

Meteor.publish('companies', function(limit) {

  db.collection('companies').aggregate([{ $group: { _id: { location: "$google_maps.geometry_location" }, companies: { $addToSet: { name: "$company_name" } }, count: { $sum: 1} } }, { $match: { count: { $gt: 1 } } }]).toArray((err, result) => {
      console.log(result);
      return result;
  });

});

1 个答案:

答案 0 :(得分:2)

使用https://docs.meteor.com/api/pubsub.html#Subscription-added中的this.addedthis.changedthis.removed ...

Meteor.publish('companies', function(limit) {
  var subscription = this;
  db.collection('companies').aggregate([{ $group: { _id: { location: "$google_maps.geometry_location" }, companies: { $addToSet: { name: "$company_name" } }, count: { $sum: 1} } }, { $match: { count: { $gt: 1 } } }]).toArray((err, result) => {
      subscription.added('companies-aggregate', 'geometry-grouping', {result: result});
  });

});

// On the client:
var CompaniesAggregate = new Mongo.Collection('companies-aggregate');

// Inside a reactive context, like a helper
var result = CompaniesAggregate.findOne('geometry-grouping').result;

当然,要使其具有反应性,您必须知道聚合结果何时会发生变化。没有自动的方法 - 您必须使用自己的代码在逻辑上解决这个问题。

执行此操作的最佳方法是将订阅变量保存在较高范围内的某个数组中,并在changed文档的'companies'的所有订阅上调用geometry-grouping,计算更新的结果。

评论者的解决方案不是实时的;换句话说,如果一个用户对例如公司名称或位置,其他用户不会看到这些更改。