【问题标题】:How to access aggregated collection data in meteor client?如何在流星客户端访问聚合的集合数据?
【发布时间】:2016-07-17 17:55:39
【问题描述】:

我汇总了一些数据并将其发布,但我不确定如何/在何处访问订阅的数据。我能否访问 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({});
  }
});

【问题讨论】:

    标签: javascript mongodb meteor iron-router meteor-helper


    【解决方案1】:

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

    可能存在不止一个问题,但在您致电added 时,您提供了一个随机 ID。这带来了两个问题:

    1. 如果您订阅 N 次,您将收到 N 个相同的文档发送给客户端(每个具有不同的 id)。有关详细信息,请参阅this question
    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,
      });
    });
    

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

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

    【讨论】:

    • 我认为我不能使用 customerId 来替换 randomId,因为所有文档都属于同一个客户。它们只是按周汇总。我更新了问题以反映您的 cmets,但我仍然需要帮助解决问题的症结。我如何能够在客户端访问 WeeklyOrders?
    • 我在答案中添加了更多信息。希望这能让您更接近解决方案。
    • 我缺少的是一个与 self.add 中的同名的客户端集合,即WeeklyOrders = new Mongo.Collection("WeeklyOrders");。没有这个,我无法引用正在发布的数据。请更新您的答案,以便我接受。
    • 啊,我想念你没有这样做。哎呀。好吧,我更新了答案。我想迟到总比没有好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2015-12-10
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多