关于链接多个any_of标准的问题#Mongoid

时间:2011-01-19 09:49:55

标签: ruby mongodb criteria mongoid

我需要运行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”的“和”的方法是什么?

5 个答案:

答案 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来解决这个问题。