【问题标题】:How to access server aggregate on the client side within meteor如何在流星内访问客户端的服务器聚合
【发布时间】:2018-03-29 02:37:24
【问题描述】:

有点菜鸟问题。我在服务器上使用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;
  });

});

【问题讨论】:

  • 创建一个server-side method,它将执行您的聚合并从客户端调用该方法。
  • 啊,好的。这就说得通了。方法和订阅有什么区别。
  • 您可以使用服务器方法在服务器端执行处理器密集型任务,并消除向您不想授予访问权限的客户端发送数据。

标签: meteor


【解决方案1】:

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;

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

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

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

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 2015-12-10
    • 1970-01-01
    • 2012-04-24
    • 2012-02-22
    • 1970-01-01
    • 2014-02-25
    • 2016-01-03
    • 2014-09-13
    相关资源
    最近更新 更多