如何访问流星客户端中的聚合集合数据?

How to access aggregated collection data in meteor client?

我汇总了一些数据并发布了它,但我不确定 how/where 是否可以访问订阅的数据。我能否访问 WeeklyOrders 客户端集合(定义为仅限客户端的集合,即 WeeklyOrders = new Mongo.Collection(null);)?

此外,我看到 "self = this;" 在几个在线示例中使用,我只是在这里使用它,但不确定为什么。也感谢任何解释这一点的人。

发布方法如下:

Meteor.publish('customerOrdersByWeek', function(customerId) {
  check(customerId, String);
  var self = this;
  var pipeline = [
    { $match: {customer_id: customerId} },
    { $group: {
        _id : { week: { $week: "$_created_at" }, year: { $year: "$_created_at" } },
        weekly_order_value: { $sum: "$order_value" }
      }
    },
    { $project: { week: "$_id.week", year: "$_id:year" } },
    { $limit: 2 }
  ];
  var result = Orders.aggregate(pipeline);
  result.forEach(function(wo) {
    self.added('WeeklyOrders', objectToHash(wo._id), {year: wo.year, week: wo.week, order_value: wo.weekly_order_value});
  });
  self.ready();
});

这是路线:

Router.route('/customers/:_id', {
  name: 'customerOrdersByWeek',
  waitOn: function() {
    return [
      Meteor.subscribe('customerOrdersByWeek', this.params._id)
    ];
  },
  data: function() { return Customers.findOne(this.params._id); }
});

这是我的模板助手:

Template.customerOrdersByWeek.helpers({
  ordersByWeek: function() {
    return WeeklyOrders.find({});
  }
});

您需要 var self = this(注意变量!)以便调用 self.added 有效。有关详细信息,请参阅 this question。或者,您可以使用新的 es6 箭头函数(再次参见链接的问题)。

可能存在不止一个问题,但在您对 added 的调用中,您提供了一个随机 ID。这会带来两个问题:

  1. 如果你订阅了N次,你会得到N份发送给客户端的同一份文件(每一份都有不同的id)。有关详细信息,请参阅
  2. 您无法在客户端通过 ID 匹配文档。

在客户端,您正在做一个 Customers.findOne(this.params._id),其中 this.params._id 是,我假设,客户 ID...但是您的 WeeklyOrders 有随机 ID。试一试:

self.added('WeeklyOrders', customerId, {...});

更新答案

您需要添加一个 client-only collection 作为一种邮箱,以便您的发布商将 WeeklyOrders 发送至:

client/collections/weekly-orders.js

WeeklyOrders = new Meteor.Collection('WeeklyOrders');

此外,由于同一用户可能有多个文档,因此您可能需要:

  1. 忘记我之前说的,只使用一个随机id,但永远不要订阅更多。这是一个简单的解决方案,但有点脆弱。

  2. 使用复合索引(结合客户 ID + 周,或使它们唯一的任何必要条件)。

使用 (2) 并添加 customerId 字段以便您可以在客户端上找到文档,结果如下所示:

result.forEach(function (wo) {
  var id = customerId + wo.year + wo.week;
  self.added('WeeklyOrders', id, {
    customerId: customerId,
    year: wo.year,
    week: wo.week,
    order_value: wo.weekly_order_value,
  });
});

现在在客户端上您可以通过 WeeklyOrders.find({customerId: someCustomerId}).

找到 customerId 的所有 WeeklyOrders

另请注意,除了使用 pub/sub,您还可以在方法调用中完成所有这些操作。两者都没有反应。 pub/sub 为您提供集合语义(调用 find 等的能力),但它增加了必须处理 id 的额外复杂性。