使用MongoID嵌套AND和OR操作



我正试图弄清楚如何用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 => "...." })

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

由于各种原因,我正在从MongoMapper迁移到MongoID,但使用MongoMaper,这些查询会简单一点,因为where方法中支持嵌套的andor运算符等所有操作。

事实证明,MongoID(更具体地说,Origin::Query)在其许多DSL函数中支持Mongo选择器语法,比如:

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

从我上面的例子来看,你可以这样做:

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

最新更新