2016-06-07 69 views
1

假设我们需要在Mongoid中编写一个范围查询。让到被查询range_field领域,那么我们做这样的事用于运行范围查询的Mongoid语法或条件

where(:range_field.lte => some-date-time, :range_field.gte => some-date-time) 

但是,如果我想运行一个查询,选择任意多个范围的,我所要做的

.or({:range_field.lte => some-date-time1, :range_field.gte => some-date-time2},{:range_field.lte => some-date-time3, :range_field.gte => some-date-time4}) 

这显然不起作用。 如何使用Mongoid运行这样的查询?

+0

你是什么意思,“显然不工作”?你有错误吗?它发现它不应该的东西吗?没有找到它应该的东西? –

+0

它只是运行大于等于查询 –

回答

0

当你说:

:range_field.lte => some_date_time 

你在Symbol调用一个方法,lte,那Mongoid猴子补丁。该方法返回一个Origin::Key实例,该实例缠绕在底层的$lte运算符中。里面的某个地方是Mongoid将Origin::Key转换的东西,MongoDB的就明白了:

{ range_field: { $lte: some_date_time } } 

如果你看一下

where(:range_field.lte => t1, :range_field.gte => t2) 

成为通过对结果调用selector,你会看到这样的事情:

{ 
    "created_at" => { 
    :$gte => t2, 
    :$lte => t1 
    } 
} 

一切都会正常工作。

但是,如果我们用#or并呼吁selector看到下面的查询,我们看到Mongoid由一个扩大Origin::Key■一个和合并的结果:

or({:range_field.lte => t1, :range_field.gte => t2}) 
# is expanded as though as you said 
or({ :range_field => { :$lte => t1 }, :range_field => { :$gte => t2 } }) 
# which is the same as 
or({ :range_field => { :$gte => t2 } }) 

从本质上讲,Mongoid正在为不一致以及它如何扩展Origin::Key。你甚至可以得到相同的结果令人困惑,如果你使用:$or,而不是#or

where(:$or => [ {:range_field.lte => t1, :range_field.gte => t2} ]).selector 

会说:

{ "$or" => [ { "range_field" => { "$gte" => t2 } } ] } 

的解决方法是不使用Symbol猴子打补丁的方法和通过这样做部分手:

or(
    { :range_field => { :$lte => t1, :$gte => t2 } }, 
    { :range_field => { :$lte => t3, :$gte => t4 } }, 
    ... 
) 
+0

这真的很有帮助..感谢很多! :) –