2013-07-25 24 views
11

ho questa query:Mongoid: E - o query

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

Esso restituisce la prossima Criteri:

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

Ma io voglio fare 'e' betweend due 'o' che restituiscono qualcosa così:

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

Come sarebbe la domanda?

risposta

25

questo potrebbe aiutare,

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

questo restituirà:

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

Non è necessario $ incatenato o query qui - si vuole solo documenti in cui il nome è in una lista, e dove l'età è in una lista. Mongo fornisce queste facilmente:

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

Nel linguaggio Mongoid, questo è semplicemente:

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