我想用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.
此外,我不希望所有父母的名单,但只有不同的女性儿童名单。
如果我使用纯Ruby,我可以做到这一点:
collection.find({}).map { |d|
d["doc"]["children"].select { |rh|
rh["genre"] == "female"
}.map { |r|
r["name"]
}
}.flatten.uniq
但我有几百万的条目并采取了很多的时间。 Mongodb肯定有办法在本地返回这个结果。
你应该实际工作中尝试定义[命名范围(http://mongoid.org/en/mongoid/docs/querying。 HTML#范围)在您的模型。 –
我不使用mongoid。我正在使用'mongo' gem来直接连接到mongodb –