Meteor:在发布或客户端上过滤数据

时间:2014-11-24 11:11:36

标签: performance mongodb meteor

在Meteor中,我想在拥有Mongo数据库的情况下处理文档级别,根据消息来源,我需要注意的是昂贵的出版物,所以今天我的问题是:

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

enter image description here

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

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

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

enter image description here

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

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

  return [ assignmentData, detailData];
});

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

对于服务器而言,哪一项最具成本效益?

1 个答案:

答案 0 :(得分:1)

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

只是发布所有内容的替代方案可能适用于小型集合,但它实际上取决于分配的数量,并且它不会以这种方式完全扩展。您需要在每次客户端连接时将整个集合发送给客户端,如果它超过MB左右,这在两端都是昂贵且耗时的,并且实际上并没有任何方式当你谈论一个动态的(即经常变化的)集合时,我认为你就是这种开销(而对于大部分静态集合,你可以用localStorage和poll-and-diff来做事。)