我正在试图弄清楚如何使用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这些查询稍微简单一些,因为and
和or
运算符等所有内容都支持{{{ 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" }
]
}
]