2014-11-24 120 views
0

在流星我想在具有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 ] }); 
}); 

还是应该小睡一下proach这样,我们跳过发布的过滤步骤,而是发布每个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

这是一个意见问题,但如果可能的话,我强烈建议将employee_id附加到AssignmentDetails的文档中,就像您在第二个示例中所述。如果出版物的功能比所需要的更为复杂,并且您可以将您的酒馆功能减少到一行(如果您在AssignmentDetails中有employee_id(即使有许多employee_id用于每个任务)通过只是搜索。您甚至不需要将该字段返回给客户端(您可以指定要在您的find中返回的字段),因此唯一引起的开销将在数据库存储(这是便宜的)并将其添加到插入/更新AssignmentDetails文档(这是不可察觉的)。实际传输的数据量与第一种情况相同。

只是发布所有内容的替代方案对于小型集合来说可能没问题,但它确实取决于分配的数量,并且这种方式根本不可能扩展。每当客户端连接时,您需要将整个集合发送给客户端,如果两端的MB大于MB,那么这两个端点都很昂贵且耗时,并且当您谈论一个动态的(即经常变化的)集合,我认为你是这样的(而对于大部分静态集合,你可以用localStorage和poll-and-diff做些事情)。