Ruby on rails 使用ruby过滤mongodb集合中的元素
我想使用Ruby on rails 使用ruby过滤mongodb集合中的元素,ruby-on-rails,ruby,mongodb,nosql,Ruby On Rails,Ruby,Mongodb,Nosql,我想使用ruby,获取mongodb集合中所有女性的子项名称: 集合中的元素如下所示: [ { "name" => "John", "children" => [{"genre" => "male", "name" => "Rick"}, {"genre" => "female", "name" => "Mary"} ] }, { "name" => "Richard",
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:等待套接字读取超时。
此外,我不想要所有父母的名单,只想要不同女性孩子的名单
如果我使用纯ruby,我可以使用:
collection.find({}).map { |d|
d["doc"]["children"].select { |rh|
rh["genre"] == "female"
}.map { |r|
r["name"]
}
}.flatten.uniq
但我有数以百万计的参赛作品,需要花费很多时间。Mongodb当然有办法以本机方式返回此结果。如果查询需要很长时间,您可以尝试更改mongo驱动程序和https://github.com/Mongodb/mongo-ruby-driver/blob/master/lib/mongo/socket/tcp.rb上的套接字超时连接,或者尝试使用skip()和限制查询的选项。我无法说明您得到的套接字超时,但此查询:
collection.find({"children" => {"genre" => "female"}})
没有给你期望的。它检查子字段和给定哈希之间是否完全相等。执行此查询的正确方法是:
collection.find("children.genre" => "female")
但它仍然发现所有至少有一个女性孩子的父母。这些父母的男性子女也包括在此视图中,您必须在获得结果后对其进行筛选
或者,您可以使用aggregate()完成整个选择:
你应该尝试在你的模型中定义。我不是在使用mongoid。我正在使用
mongo
gem直接连接到mongodb
collection.aggregate([
{:$unwind => '$children'},
{:$match => {'children.genre' => 'female'}},
{:$group => {_id: '$children'}}
]).map { |c| c[:_id] }