我有一个类似下面的mongo集合(Foo(X)== keys; Bars == values):编辑 - 我来自关系数据库背景。显然我的收藏品看起来不像下面的那样,但你明白了......
+--------+--------+--------+
| Foo1 | Foo2 | Foo3 |
+--------+--------+--------+
| Barbar | Barbar | Bar |
| bar | Bar | BarBar |
| Bar | barbar | barBar |
| ... | ... | ... |
允许我的客户过滤数据对我来说很重要。有时候,所有列都会有一个过滤器,有时候没有列会有过滤器,而且介于两者之间。目前,我处理的问题如下:
客户端
Var aFoo1Filter = ["bar"]
Var aFoo2Filter = ["Barbar", "BarBar"]
Var aFoo3Filter = ["barbar", "bar"]
//Where the user can affect the array through some other code
服务器
Meteor.publish("foos", function (aFoo1Filter, aFoo2Filter, aFoo3Filter ) {
return FooCl.find({Foo1: {$in: aFoo1Filter},
Foo2: {$in: aFoo2Filter},
Foo3: {$in: aFoo3Filter}},
{limit: 10});
});
我希望通过从客户端到服务器只传递一个对象或一个字符串来简化这一过程,但这两种尝试都没有奏效。请参阅下面的尝试:
尝试#1 - 传递字符串
客户端
Var sFilter = "Foo1: {$in: [\"bar\"]},
Foo2: {$in: [\"Barbar\", \"BarBar\"]},
Foo3: {$in: [\"barbar\", \"bar\"]}"
服务器
Meteor.publish("foos", function (sFilter) {
return FooCl.find({sFilter},
{limit: 10});
});
//////////////////
尝试#2 - 传递对象
客户端
var oFilter = {
Foo1: "bar"
}
服务器
Meteor.publish("foos", function (oFilter) {
return FooCl.find({oFilter},
{limit: 10});
});
我此刻没有机器,所以我无法提供有关错误类型的更多详细信息。希望今晚能有更多信息。谢谢你的帮助!
答案 0 :(得分:6)
解决此问题的最简单方法是使用选择器进行订阅:
var selector = {Foo1: {$in: aFoo1Filter}, Foo2: {$in: aFoo2Filter}};
Meteor.subscribe('foos', selector);
Meteor.publish('foos', function (selector) {
return FooCl.find(selector, {limit: 10});
});
但是,重要的是要认识到这使客户能够从她想要的FooCl
集合中请求任何文档。改进的解决方案是在选择器上使用match来限制可以请求的内容。例如:
Meteor.publish('foos', function(selector) {
check(selector, {
Foo1: Match.Optional({$in: [String]}),
Foo2: Match.Optional({$in: [String]})
});
if (!_.isEmpty(selector)) {
return FooCl.find(selector, {limit: 10});
}
});
这将确保selector
在将任何文档发送到客户端之前符合可接受的模式。