【问题标题】:Meteor: filter data in publish or on clientMeteor:在发布或客户端过滤数据
【发布时间】:2014-11-24 19:53:06
【问题描述】:

在 Meteor 中,我想在拥有 Mongo 数据库时在文档级别上工作,根据消息来源,我必须注意昂贵的出版物,所以今天我的问题是:

我将如何发布具有关系的文档,我是否会遵循关系类型的查询,我们会在其中找到具有如下分配 ID 的分配详细信息:

Meteor.publish('someName', function () {
  var empId = "dj4nfhd56k7bhb3b732fd73fb";

  var assignmentData = Assignment.find({ employee_id: empId });
  return AssignmentDetails.find({ assignment_id: $in [ assignment ] });
});

或者我们是否应该采用这样的方法,在发布中跳过过滤步骤,而是发布每个 assignment_detail 并在客户端处理该过滤器:

Meteor.publish('someName', function () {
  var empId = "dj4nfhd56k7bhb3b732fd73fb";

  var assignmentData = Assignment.find({ employee_id: empId });
  var detailData = AssignmentDetails.find({ employee_id: empId });

  return [ assignmentData, detailData];
});

我想这是一个问题,是在服务器上搜索的数据量应该更多还是传输到客户端的数据量应该更大。

其中哪一个对服务器来说最具成本效益?

【问题讨论】:

    标签: performance mongodb meteor


    【解决方案1】:

    这是一个见仁见智的问题,但如果可能的话,我强烈建议将employee_id 附加到AssignmentDetails 中的文档中,就像您在第二个示例中所做的那样。您认为出版物很昂贵是正确的,但如果发布功能比必要的复杂,则更是如此,并且如果您在 employee_id 中有 employee_id (即使有每个作业都有很多employee_ids),只需搜索即可。您甚至不需要将该字段返回给客户端(您可以在 find 中指定要返回的字段),因此唯一产生的开销将是数据库存储(这很便宜)并将其添加到插入/updated AssignmentDetails docs(这是难以察觉的)。实际传输的数据量与第一种情况相同。

    仅发布所有内容的替代方案对于小型集合来说可能没问题,但这实际上取决于分配的数量,而且这种方式根本无法扩展。每次客户端连接时,您都需要将整个集合发送到客户端,如果超过 1 MB 左右,这在两端都是昂贵且耗时的,而且当您在谈论一个动态(即经常变化的)集合,我认为你是(而对于大部分静态集合,你可以使用 localStorage 和 poll-and-diff 来做事情)。

    【讨论】:

      猜你喜欢
      • 2015-08-15
      • 1970-01-01
      • 2017-07-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 2016-06-16
      相关资源
      最近更新 更多