我遇到了以下问题:
我有一个自定义服务器端发布“P1”,它从集合“C”返回一组文档,服务器是唯一能够构建这个子集的服务器
在我的客户上,我订阅了 2 个发布(“P1”和“P2”)返回集合“C”的 2 个子集,它们可能重叠。
我想在我的客户端上仅列出出版物“P1”返回的元素,即服务器只能生成集合的元素。问题是我无法使用常规查找查询来过滤集合“C”并获取子集“P1”。这是因为只有服务器才能随意这样做。
然后,我如何根据文档的发布来源在客户端过滤文档?
我遇到了以下问题:
我有一个自定义服务器端发布“P1”,它从集合“C”返回一组文档,服务器是唯一能够构建这个子集的服务器
在我的客户上,我订阅了 2 个发布(“P1”和“P2”)返回集合“C”的 2 个子集,它们可能重叠。
我想在我的客户端上仅列出出版物“P1”返回的元素,即服务器只能生成集合的元素。问题是我无法使用常规查找查询来过滤集合“C”并获取子集“P1”。这是因为只有服务器才能随意这样做。
然后,我如何根据文档的发布来源在客户端过滤文档?
据我所知,您不能直接这样做。
一种可能的解决方案可能是使用 Meteor 方法来请求发布所需的 id,然后使用这些 id 进行订阅,然后您可以使用已有的 id 列表过滤客户端。
Meteor 将自动在单个实例中发布正确的文档(因此它们不会发布两次)。
因此,客户端实际上无法分辨出差异,因为服务器不会很清楚地说明集合重叠。
除了使用 Elizier 建议的方法外,别无他法:
Meteor.methods({
differences: function() {
var queryOne = _(MyCollection.find({..}).fetch()).pluck("_id");
var queryTwo = _(MyCollection.find({..}).fetch()).pluck("_id");
var differences = _([queryOne, queryTwo]).difference();
var intersection = _([queryOne, queryTwo]).intersection();
return differences
}
});