【问题标题】:querying nested documents mongodb ruby查询嵌套文档 mongodb ruby
【发布时间】:2014-03-19 22:20:02
【问题描述】:

我完全被难住了!

我在一个名为“Gene”的集合中有以下文档结构,我感兴趣的子文档是“DrugDBI”。我希望返回的字段是“drug_name”,仅此而已;这里是“AAA”和“LLL”。

{
 "ADR": [
{
  "adverse_type": "YYY",
}
],
"DrugDBI": [
{
  "cancer_type": "XXX",
  "drug_name": "AAAA",
},
{
  "cancer_type": "1405-87-4",
  "drug_name": "LLL",
}
]
"_id": "A2M",
"ts": { "$date": 1395239463625 }
}

在通过 id 查询时,我只需要从子文档中提取一个字段(即“drug_name”);

例如;

我的查询ID是@gene_v;这里是“A2M”

@gened = DB['Gene'].find({_id:@gene_v,fields:[{"DrugDBI" => {"$elemMatch" => {"$in" => "drug_name" } }}]}).to_a

puts "Drugs related to genes -> <#{@gened}>"

这显然不返回任何值。感谢您的帮助。

当前输出是;

Drugs related to genes -> <[]>

【问题讨论】:

    标签: ruby mongodb


    【解决方案1】:

    MongoDB 只提供“文档”,而不是任意的单个字段值或字段值数组。 因此,您将始终必须按键从文档中提取单个值。 然而,MongoDB 和文档的主要优势在于与编程语言结构相匹配, 因此使您能够使用您的编程语言。 您应该将您的编程语言视为您选择的主要工具。

    MongoDB 查找查询仅允许简单的投影/选择顶级字段。 你可以使用聚合框架做更复杂的提取和转换, 但我建议您先使用您的编程语言。 我希望下面的测试能够为您说明这一切。

    test.rb

    require 'mongo'
    require 'json'
    require 'test/unit'
    
    class MyTest < Test::Unit::TestCase
      def setup
        @coll = Mongo::MongoClient.new['test']['Gene']
        doc = JSON.parse <<-EOT
        { "ADR" : [{"adverse_type" : "YYY"}],
          "DrugDBI" : [{"cancer_type" : "XXX", "drug_name" : "AAAA"}, {"cancer_type" : "1405-87-4", "drug_name" : "LLL"}],
          "_id" : "A2M",
          "ts" : {"$date" : 1395239463625}
        }
        EOT
        @coll.remove
        @coll.insert(doc)
      end
    
      test "extract cancer drugs" do
        @gene_v = "A2M"
    
        doc = @coll.find({_id:@gene_v},fields:["DrugDBI"]).to_a.first
        @gened = doc["DrugDBI"].collect{|cancer_drug| cancer_drug["drug_name"]}
        assert_equal(["AAAA", "LLL"], @gened)
        puts "Drugs related to genes -> <#{@gened}>"
    
        doc = @coll.aggregate([
          {"$match" => {"_id" => @gene_v}},
          {"$unwind" => "$DrugDBI"},
          {"$project" => {"drug_name" => "$DrugDBI.drug_name"}},
          {"$group" => {"_id" => "$_id", "drug_name" => {"$push" => "$drug_name"}}}
        ]).to_a.first
        @gened = doc["drug_name"]
        assert_equal(["AAAA", "LLL"], @gened)
        puts "Drugs related to genes -> <#{@gened}>"
      end
    end
    

    $ ruby​​ test.rb

    Loaded suite test
    Started
    Drugs related to genes -> <["AAAA", "LLL"]>
    Drugs related to genes -> <["AAAA", "LLL"]>
    .
    
    Finished in 0.010455 seconds.
    
    1 tests, 2 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
    

    【讨论】:

      猜你喜欢
      • 2021-02-25
      • 2016-08-16
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2017-04-10
      相关资源
      最近更新 更多