2013-07-25 35 views
11

Tôi có truy vấn này:Mongoid: Và - Hoặc truy vấn

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

Nó trả về Tiêu chuẩn tiếp theo:

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

Nhưng tôi muốn làm 'và' betweend hai 'hoặc' trả lại một cái gì đó như thế này:

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

Truy vấn sẽ như thế nào?

Trả lời

25

điều này có thể giúp bạn,

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

này sẽ trở lại:

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

Bạn không cần phải xích $ hoặc truy vấn ở đây - bạn chỉ muốn các văn bản nơi tên là trong danh sách, và độ tuổi trong danh sách. Mongo cung cấp này một cách dễ dàng:

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

Trong cách nói Mongoid, điều này chỉ đơn giản là:

User.where(enabled: true, name.in: ["John", "Sara"], age.in: [17, 18]) 
Các vấn đề liên quan