【问题标题】:Meteor: Best Method for Passing Mongo Selector from Client to ServerMeteor:将 Mongo 选择器从客户端传递到服务器的最佳方法
【发布时间】:2014-05-29 16:06:18
【问题描述】:

我有一个 mongo 集合,如下所示(Foo(X) == 键;Bars == 值): 编辑 - 我来自关系数据库背景。显然我的收藏看起来不像下面,但你明白了......

+--------+--------+--------+
|  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});
});

目前我的机器不在身边,因此我无法提供有关所引发错误类型的更多详细信息。希望今晚有更多的信息。感谢您的帮助!

【问题讨论】:

    标签: javascript mongodb meteor


    【解决方案1】:

    解决此问题的最简单方法是使用选择器进行订阅:

    客户

    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 在将任何文档发送给客户端之前符合可接受的模式。

    【讨论】:

    • 成功了,谢谢!看起来我的错误是在我的 sFilter 和 oFilter 周围加上大括号 {}。另外,感谢有关选择器匹配的提示!
    猜你喜欢
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    相关资源
    最近更新 更多