13

我有这个查询:

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

它返回下一个标准:

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

但我想做两个“或”之间的“和”,返回如下内容:

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

查询将如何?

4

2 回答 2

27

这可能会帮助你,

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

这将返回:

#<Mongoid::Criteria
  selector: {"enabled"=>true, "$and"=>[{"$or"=>[{"name"=>"John"}, {"name"=>"Sara"}]}, {"$or"=>[{"age"=>17}, {"age"=>18}]}]}
  options:  {}
  class:    User
  embedded: false>
于 2013-07-28T04:40:54.333 回答
7

您不需要在这里链接 $or 查询 - 您只需要名称在列表中的文档,以及年龄在列表中的位置。Mongo 很容易提供这个:

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

用 Mongoid 的说法,这很简单:

User.where(enabled: true, name.in: ["John", "Sara"], age.in: [17, 18])
于 2013-07-28T06:34:35.953 回答