我需要运行MongoDB查询,如下所示:
db.collection.find({ $or : [{"field1" : "value1"}, {"field2" : "value2"}], $or : [{"field3" : "value3"}, {"field4" : "value4"}]})
即。
(field1 == value 1 or field2 == value2) and (field3 == value3 or field4 == value4)
我想通过标准链来实现这一点,因为查询已经形成 动态地从代码的不同部分。但是,如果我尝试做类似以下的事情
criteria = Collection.any_of({"field1" => "value1"}, {"field2" => "value2"}) criteria = criteria.any_of({"field3" => "value3"}, {"field4" => "value4"})
我得到结果查询,其中所有这些组合成单个$或 声明如
db.collection.find({ $or : [{"field1" : "value1"}, {"field2" : "value2"}, {"field3" : "value3"}, {"field4" : "value4"}]})
使用标准链接实现两个“any_of”的“和”的方法是什么?
答案 0 :(得分:4)
你可以避免any_of。
criteria = Collection.where('$or' => [{"field1" => "value1"}, {"field2" => "value2"}])
criteria = criteria.where('$or' => [{"field3" => "value3"}, {"field4" => "value4"}])
答案 1 :(得分:4)
你可以用mongoid 2.4.0写这个:
Collection.all_of({"$or" => [{"field1" => "value1"}, {"field2" => "value2"}]}, {"$or" => [{"field3" => "value3"}, {"field4" => "value4"}]})
答案 2 :(得分:2)
对于Mongoid 3和4,有一种相对不错的链接方式或标准而不合并。
TL; DR
MyModel.all_of(MyModel.xxx.selector, MyModel.yyy.selector)
Mongoid维护者Durran在这个Github问题中展示了上述技巧: https://github.com/mongoid/mongoid/issues/2170
您可以使用相同的技术和一些数组技巧任意链接标准,如下所示:
selectors = []
selectors << MyModel.search(term) if term
selectors << MyModel.some_any_of if some_condition
selectors << MyModel.some_other_any_of if some_other_condition
...
MyMode..all_of(*selectors)
每一行都会添加另一个和条件。
您可能还需要注意,您不必从模型中构建每个选择器。您可以从权限系统中获取初始范围,或者在添加更多条件之前只需调用.selector。
答案 3 :(得分:1)
让我永远做到这一点,但这对我有用:
scope :for_user, lambda {|user|
any_of(
{recipient_id: Moped::BSON::ObjectId.from_string(user.id)},
{sender_id: Moped::BSON::ObjectId.from_string(user.id)},
{sender_email: user.email},
{recipient_email: user.email}
)
}
您必须确保在$or
中包含{}
条件的各个条件,以便正确地嵌套OR。 (使用Mongoid3 / Moped)
答案 4 :(得分:0)
情况仍然如此。我只能通过直接使用Ruby Mongo Driver API来解决这个问题。