当你说:
: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 } },
...
)
你是什么意思,“显然不工作”?你有错误吗?它发现它不应该的东西吗?没有找到它应该的东西? –
它只是运行大于等于查询 –