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] }