2017-08-14 130 views
0

鑑於以下文件(片段):Mongoid訪問具有attributes.values_at的嵌套屬性?

{ 
    udid: "0E321DD8-1983-4502-B214-97D6FB046746", 
    person: { 
     "firstname": "Jacob", 
     "lastname": "Prince" 
    } 
} 

I'n我的控制檯我可以基本上做到:

mycollection.first.attributes.values_at("udid", "person") 

這將返回哈希

現在我想單個字段。但這些不工作(person.firstname):

mycollection.first.attributes.values_at("udid", "person.firstname") 
mycollection.first.attributes.values_at("udid", "person[:firstname]") 
mycollection.first.attributes.values_at("udid", "person['firstname']") 

如何如何訪問的人兒文檔?

我需要有用戶選擇他們想要導出哪些fieds。我正沿着做這樣的事情的思路思考:

class Foo 
    include Mongoid::Document 

    # fields definitions 
    embeds_one :person # two fields: firstname, lastname 

    def to_csv *columns 
     attributes.values_at *columns 
    end 
end 

回答

0

請告訴我一個(最)有效的方式來選擇特定字段?

如果您已經知道字段及其嵌套鍵,那麼使用Ruby v2.3 +,您可以使用dig()內置方法。例如:

document = collection.find({},{'projection' => {'uid' => 1, "person.firstname" => 1 }}).first 
result = [document.dig("uid"), document.dig("person", "firstname")] 
puts result.inspect 

另外,根據您的應用程序使用情況,你也可以利用MongoDB Aggregation Pipeline,尤其是$project operator 例如:

document = collection.aggregate([{"$project"=>{ :uid=>"$uid", :person_firstname=>"$person.firstname"}}]).first 
puts document.values_at("uid", "person_firstname").inspect 

注意,上面的投影重命名嵌套person.firstname成扁平化領域稱爲person_firstname

另請參見MongoDB Ruby Driver: Aggregation Tutorial