Mongoid访问带有attributes.values_at的嵌套属性?

时间:2017-08-14 15:07:16

标签: ruby-on-rails ruby mongodb mongoid

鉴于以下文件(摘录):

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

我的控制台基本上可以做到:

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']")

如何访问此人儿童文件?

我需要用户选择要导出的fied。我正在考虑做这样的事情:

class Foo
    include Mongoid::Document 

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

    def to_csv *columns
       attributes.values_at *columns
    end
end

1 个答案:

答案 0 :(得分: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