【问题标题】:Mongoid: And - Or queryMongoid:和 - 或查询
【发布时间】:2013-07-25 08:30:03
【问题描述】:

我有这个问题:

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>

查询会怎样?

【问题讨论】:

    标签: mongoid


    【解决方案1】:

    这可能对你有帮助,

    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>
    

    【讨论】:

      【解决方案2】:

      您不需要在这里链接 $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])
      

      【讨论】:

        猜你喜欢
        • 2017-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-04
        • 2013-07-25
        • 1970-01-01
        • 2014-05-19
        • 2016-10-02
        相关资源
        最近更新 更多