我正试图弄清楚如何用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
方法中支持嵌套的and
和or
运算符等所有操作。
事实证明,MongoID(更具体地说,Origin::Query)在其许多DSL函数中支持Mongo选择器语法,比如:
Model.where( { "name" => { "$or" => [ "betsy", "charles" ] } )
从我上面的例子来看,你可以这样做:
Model.all_of( [
{
"$or" => [
{"name"=> "joe"}, {"name" => "randy" }
},
{
"$or" => [
{"something" => "else" }, {"another" => "thing" }
]
}
]