Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 关于链接多个任意条件的问题#Mongoid_Ruby_Mongodb_Criteria_Mongoid - Fatal编程技术网

Ruby 关于链接多个任意条件的问题#Mongoid

Ruby 关于链接多个任意条件的问题#Mongoid,ruby,mongodb,criteria,mongoid,Ruby,Mongodb,Criteria,Mongoid,我需要运行MongoDB查询,如下所示: db.collection.find({ $or : [{"field1" : "value1"}, {"field2" : "value2"}], $or : [{"field3" : "value3"}, {"field4" : "value4"}]}) find({$or:[{“field1”:“value1”},{“field2”:“value2”}), $or:[{“field3”:“value3”},{“field4”:“value4”}]

我需要运行MongoDB查询,如下所示:

db.collection.find({ $or : [{"field1" : "value1"}, {"field2" : "value2"}], $or : [{"field3" : "value3"}, {"field4" : "value4"}]}) find({$or:[{“field1”:“value1”},{“field2”:“value2”}), $or:[{“field3”:“value3”},{“field4”:“value4”}]}) i、 e

(field1==值1或field2==值2)和(field3==值3或field4 ==值4) 我希望通过条件链接来实现这一点,因为查询已形成 从代码的不同部分动态删除。但是如果我试着做下面的事情

criteria = Collection.any_of({"field1" => "value1"}, {"field2" => "value2"}) criteria = criteria.any_of({"field3" => "value3"}, {"field4" => "value4"}) 条件=集合。({“field1”=>“value1”},{“field2”=> “值2”}) 条件=条件({“field3”=>“value3”},{“field4”=>“value4”})中的任何单位 我得到一个结果查询,其中所有这些都组合成一个$or 陈述式

db.collection.find({ $or : [{"field1" : "value1"}, {"field2" : "value2"}, {"field3" : "value3"}, {"field4" : "value4"}]}) find({$or:[{“field1”:“value1”},{“field2”:“value2”}, {“field3”:“value3”},{“field4”:“value4”}]})
使用标准链接实现两个“任意”中的“和”的方法是什么?

您可以使用避免任意

criteria = Collection.where('$or' => [{"field1" => "value1"}, {"field2" => "value2"}])
criteria = criteria.where('$or' => [{"field3" => "value3"}, {"field4" => "value4"}])

您可以使用mongoid 2.4.0编写以下内容:

  Collection.all_of({"$or" => [{"field1" => "value1"}, {"field2" => "value2"}]}, {"$or" => [{"field3" => "value3"}, {"field4" => "value4"}]})

我花了很长时间才把这件事做好,但这对我来说很有用:

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。(使用Mongoid3/轻便摩托车)

情况仍然如此。我只能通过直接使用Ruby Mongo驱动程序API来解决这个问题。

对于Mongoid 3和4,有一种相对不错的方法可以链接或标准,而无需合并

TL;博士

Mongoid维护者Durran在这个Github问题上展示了上述技巧:

您可以使用相同的技术和一些数组技巧任意链接条件,如下所示:

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)
选择器=[]

选择器您使用哪个版本的Mongoid?Mongoid处理/$或的方式存在问题。在Github上出现了一个问题:这个答案很有帮助-尝试了这个。但它也产生了相同的结果,所有查询字段都合并到一个“$或”查询中-类似于使用任何(u of),您可以在MongoDB控制台上成功执行请求?在较新版本的Mongoid中,您可以执行
Collection.或({“field1”=>“value1”},{“field2”=>“value2”})或({“field3”=>“value3”},{“field4”=>“value4”})
。这很可能包含太多文档。在我的例子中,我希望文档同时满足$or条件。Collection.all_of添加一个条件,该条件指定必须全部匹配才能返回结果的表达式。对应的MongoDB操作是$and。所以这应该是类似((field1==value1)或(field2==value2))和((field3==value3)或(field4==value4))的内容。谢谢,这对我来说很有效,并且保持了搜索条件的清晰
MyModel.all_of(MyModel.xxx.selector, MyModel.yyy.selector)
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)