使用MongoID嵌套AND和OR操作

时间:2012-12-17 21:40:49

标签: sinatra mongoid mongoid3

我正在试图弄清楚如何使用MongoID嵌套AND和OR操作,就像这样(取自我以前用于MongoMapper的东西):

{
:$and=> [
    {
        :$or => [
            {"name"=> "joe"}, {"name" => "randy" }
    {
        :$or=> [
            {"something" => "else" }, {"another" => "thing" }
        ]
    }
]
}

我对联合和交集的工作方式并不是非常熟悉,但是踢球者是AND中的每个孩子都是可选的/不能保证的。换句话说,AND中的每个查询都是程序化的,可以检查2个项目,1个项目等。

我想过做这样的事情:

Model.or({ :name => "...." }).union.or( :something => "...." })

但是,唯一的问题是我不确定基于用户输入构建查询的最佳实践。我有一个基于sinatra的应用程序,它作为连接到我的MongoID模型的用户的API点,我希望用户能够通过API构建这样的查询(可能不是这么复杂)。

由于各种原因,我正在从MongoMapper迁移到MongoID,但是使用MongoMapper这些查询稍微简单一些,因为andor运算符等所有内容都支持{{{ 1}}方法。

1 个答案:

答案 0 :(得分:1)

事实证明,MongoID(更确切地说是Origin :: Query)支持许多DSL函数中的Mongo选择器语法,如下所示:

Model.where(   { "name" => { "$or" => [ "betsy", "charles" ] }   )

从上面的例子中收集,你可以这样做:

Model.all_of(    [
    {
        "$or" => [
            {"name"=> "joe"}, {"name" => "randy" }
    },
    {
        "$or" => [
            {"something" => "else" }, {"another" => "thing" }
        ]
    }
]