Mongoid: выбрать встроенные объекты, которые соответствуют количеству опций - PullRequest
4 голосов
/ 12 сентября 2011

У меня есть эта структура

class House
  include Mongoid::Document
  embeds_many :inhabitants
end

class Inhabitant
  include Mongoid::Document
  embedded_in :house
  field :name
  field :gender
  field :age
end

Я могу получить все дома, где живут женщины:

houses = House.where("inhabitants.gender" => "female")

Но как мне получить все дома, где живут женщины в возрасте до 50 лет?Как указать более одного условия для встроенного объекта?

Ответы [ 2 ]

7 голосов
/ 12 сентября 2011

Чтобы применить несколько условий к каждой записи в массиве, вы должны использовать оператор $elemMatch. Я не знаком с Mongoid, но вот синтаксис оболочки MongoDB для вашего запроса, модифицированный для использования $elemMatch:

> db.house.find({inhabitants: {$elemMatch: {gender: "female", age: {$lt: 50}}}})
0 голосов
/ 12 сентября 2011

Попробуйте:

houses = House.where("inhabitants.gender" => "female", "inhabitants.age" => {"$lt" => 50})

Условия объединения : запрос MongoDB:

db.houses.find({'inhabitants.age' : {$in: {$lt: 50}}})

Mongoid:

houses = House.where('inhabitants.age' => {'$in' => {'$lt' => 50}})
...