Я хочу, чтобы все дети имена, которые женского в коллекции в MongoDB используя ruby
:Фильтрующие элементы в MongoDB коллекции с рубином
элементы в коллекции, как это:
[
{ "name" => "John",
"children" => [{"genre" => "male", "name" => "Rick"},
{"genre" => "female", "name" => "Mary"}
]
},
{ "name" => "Richard",
"children" => [{"genre" => "female", "name" => "Vicky"},
{"genre" => "female", "name" => "Mary"}
]
}]
Когда я выполняю:
collection.find({"children" => {"genre" => "female"}})
Я получаю Mongo::OperationTimeout: Timed out waiting on socket read.
Кроме того, я не хочу список всех родителей, но только список разных женщин.
Если я использую чистый рубин, я мог бы сделать это с помощью:
collection.find({}).map { |d|
d["doc"]["children"].select { |rh|
rh["genre"] == "female"
}.map { |r|
r["name"]
}
}.flatten.uniq
Но у меня есть миллионы записей и занимает много времени. У монгодба наверняка есть способ вернуть этот результат изначально.
Вы должны actuall попытаться определить [именованные группы] (http://mongoid.org/en/mongoid/docs/querying. html # scoping) в ваших моделях. –
Я не использую мангоид. Я использую 'mongo' gem для непосредственного подключения к mongodb –