Mongoid: And - Or query

你说的曾经没有我的故事 提交于 2019-12-10 01:16:13

问题


I have this query:

User.or( { name: 'John' }, { name: 'Sara' } ).or( { age: 17 }, { age: 18 } ) )

It returns the next Criteria:

#<Mongoid::Criteria
  selector: {"enabled"=>true, "$or"=>[{"name"=>"John"}, {"name"=>"Anoun"}, {"age"=>17}. {"age"=>18}]}
  options:  {}
  class:    User
  embedded: false>

But I want to do 'and' betweend two 'or' that return something like this:

#<Mongoid::Criteria
  selector: {"enabled"=>true, "$and"=>[
    {"$or"=>[{"name"=>"John"}, {"name"=>"Anoun"}]}, 
    {"$or"=>[{"age"=>17}, {"age"=>18}]}
  ] }
  options:  {}
  class:    User
  embedded: false>

How would be the query ?


回答1:


this might help you,

User.where(enabled: true)
    .and( 
          User.or( { name: 'John' }, { name: 'Sara' } ).selector,
          User.or( { age: 17 }, { age: 18 } ).selector
        )

this will return:

#<Mongoid::Criteria
  selector: {"enabled"=>true, "$and"=>[{"$or"=>[{"name"=>"John"}, {"name"=>"Sara"}]}, {"$or"=>[{"age"=>17}, {"age"=>18}]}]}
  options:  {}
  class:    User
  embedded: false>



回答2:


You don't need chained $or queries here - you just want documents where the name is in a list, and where the age is in a list. Mongo provides this easily:

db.users.find({enabled: true, name: {$in: ["John", "Sara"]}, age: {$in: [17, 18]}})

In Mongoid parlance, this is simply:

User.where(enabled: true, name.in: ["John", "Sara"], age.in: [17, 18])


来源:https://stackoverflow.com/questions/17852853/mongoid-and-or-query

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!