Mongodb - 查询深层嵌套数组

sha*_*ker 0 mongodb aggregation-framework

我已经在SO和谷歌上提出了类似的问题2天了.这是文件

{
    "rows" : [
        {
            "company" : "1 Gables Inn Bed & Breakfast",
            "address" : " 318 Quapaw Avenue Hot Springs",
            "a_url" : " AR 71901 Phone: 501-623-7576 ",
            "json" : {
                "results" : [
                    {
                        "address_components" : [
                            {
                                "long_name" : "318",
                                "short_name" : "318",
                                "types" : [ "street_number" ]
                            },
                            {
                                "long_name" : "Quapaw Avenue",
                                "short_name" : "Quapaw Ave",
                                "types" : [ "route" ]
                            },
                            {
                                "long_name" : "Hot Springs",
                                "short_name" : "Hot Springs",
                                "types" : [ "locality", "political" ]
                            },
                            {
                                "long_name" : "Hot Springs",
                                "short_name" : "Hot Springs",
                                "types" : [ "administrative_area_level_3", "political" ]
                            },
                            {
                                "long_name" : "Garland County",
                                "short_name" : "Garland County",
                                "types" : [ "administrative_area_level_2", "political" ]
                            },
                            {
                                "long_name" : "Arkansas",
                                "short_name" : "AR",
                                "types" : [ "administrative_area_level_1", "political" ]
                            },
                            {
                                "long_name" : "United States",
                                "short_name" : "US",
                                "types" : [ "country", "political" ]
                            },
                            {
                                "long_name" : "71901",
                                "short_name" : "71901",
                                "types" : [ "postal_code" ]
                            }
                        ],
                        "formatted_address" : "318 Quapaw Avenue, Hot Springs, AR 71901, USA",
                        "geometry" : {
                            "bounds" : {
                                "northeast" : {
                                    "lat" : 34.508227,
                                    "lng" : -93.05744779999999
                                 },
                                "southwest" : {
                                    "lat" : 34.50822,
                                    "lng" : -93.05746420000001
                                 }
                             },
                             "location" : {
                                 "lat" : 34.508227,
                                 "lng" : -93.05746420000001
                             },
                             "location_type" : "RANGE_INTERPOLATED",
                             "viewport" : {
                                 "northeast" : {
                                     "lat" : 34.5095724802915,
                                     "lng" : -93.05610701970851
                                 },
                                 "southwest" : {
                                     "lat" : 34.5068745197085,
                                     "lng" : -93.05880498029151
                                 }
                             }
                         },
                         "types" : [ "street_address" ]
                     }
                 ],
                 "status" : "OK"
             }
         },
         {
             "company" : "1000 Acres Retreat House",
             "address" : " 122 Russell Street  Hot Springs ",
             "a_url" : " AR 71901 501-318-4117  Website ",
             "json" : {
                 "results" : [
                     {
                         "address_components" : [
                             {
                                 "long_name" : "122",
                                 "short_name" : "122",
                                 "types" : [ "street_number" ]
                             },
                             {
                                 "long_name" : "Russell Street",
                                 "short_name" : "Russell St",
                                 "types" : [ "route" ]
                             },
                             {
                                 "long_name" : "Hot Springs",
                                 "short_name" : "Hot Springs",
                                 "types" : [ "locality", "political" ]
                             },
                             {
                                 "long_name" : "Hot Springs",
                                 "short_name" : "Hot Springs",
                                 "types" : [ "administrative_area_level_3", "political" ]
                             },
                             {
                                 "long_name" : "Garland County",
                                 "short_name" : "Garland County",
                                 "types" : [ "administrative_area_level_2", "political" ]
                             },
                             {
                                 "long_name" : "Arkansas",
                                 "short_name" : "AR",
                                 "types" : [ "administrative_area_level_1", "political" ]
                             },
                             {
                                 "long_name" : "United States",
                                 "short_name" : "US",
                                 "types" : [ "country", "political" ]
                             },
                             {
                                 "long_name" : "71901",
                                 "short_name" : "71901",
                                 "types" : [ "postal_code" ]
                             }
                         ],
                         "formatted_address" : "122 Russell Street, Hot Springs, AR 71901, USA",
                         "geometry" : {
                             "location" : {
                                 "lat" : 34.5313788,
                                 "lng" : -93.05564799999999
                             },
                             "location_type" : "ROOFTOP",
                             "viewport" : {
                                 "northeast" : {
                                     "lat" : 34.5327277802915,
                                     "lng" : -93.05429901970848
                                 },
                                 "southwest" : {
                                     "lat" : 34.5300298197085,
                                     "lng" : -93.0569969802915
                                 }
                             }
                         },
                         "types" : [ "street_address" ]
                     }
                 ],
                 "status" : "OK"
             }
         }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我想知道,这些行来自Google地理编码结果

我要做的是找到并提取每个地址的"postal_code"."postal_code"的位置可能因请求而异,因此我们不能依赖于数组中固定的预期位置.相反,我们必须识别等于"postal_code"的"类型",然后提取相应的"long_name".最终,"postal_code"将重新回到MySQL,所以我想这里的目标是"压扁"文档.

万一它可以帮助任何人,这是Mongodb中的记录:

mongo截图

每个记录都在它自己的数组行中,这似乎使查询复杂化,因为我尝试了以下变体:

db.AR.find({ 'results.address_components.types': { $in: ["postal_code"] } }).toArray()

db.AR.find({ 'rows.results.address_components.types': { $in: ["postal_code"] } }).toArray()
Run Code Online (Sandbox Code Playgroud)

......并且似乎无法获得任何结果.没什么,齐尔奇.纳达.

顺便说一下,这是我第一次使用MongoDB,因为它似乎是最适合此类问题的工具.我也尝试过MySQL"json_extract"UDF函数,但我似乎也无法取得任何进展.所以我想我所说的是,如果我让它变得比它需要的更困难 - 而且有人有更好的方法 - 我愿意接受建议.

不要脸

Nei*_*unn 5

你真正想要的是聚合框架,它不仅用于"聚合"结果,还用于"文档重塑",这是你问题的一部分.您也没有按要求通过正确的路径查询

db.AR.aggregate([
    { "$unwind": "$rows" },
    { "$unwind": "$rows.json.results" },
    { "$unwind": "$rows.json.results.address_components" },
    { "$match": {
        "rows.json.results.address_components.types": "postal_code"
    }},
    { "$project": {
        "company": "$rows.company",
        "address": "$rows.address",
        "postal_code": "$rows.json.results.address_components.long_name"
    }}
])
Run Code Online (Sandbox Code Playgroud)

给你一个结果:

{
    "_id" : ObjectId("5383eebcdef83b11e3d71ec4"),
    "company" : "1 Gables Inn Bed & Breakfast",
    "address" : " 318 Quapaw Avenue Hot Springs",
    "postal_code" : "71901"
}
{
    "_id" : ObjectId("5383eebcdef83b11e3d71ec4"),
    "company" : "1000 Acres Retreat House",
    "address" : " 122 Russell Street  Hot Springs ",
    "postal_code" : "71901"
}
Run Code Online (Sandbox Code Playgroud)

由于文档包含嵌套数组,因此$unwind在使用之前必须将所有这些数据$match过滤到types最内层数组中字段中包含"postal_code"的结果.该$unwind声明"反规范化"的文件,基本上是建立为每个阵列条目的文档"复制".

最后,您可以使用$project将文档重新塑造或"展平"为您想要的结果样式.

您还可以阅读文档中有关聚合框架运算符的更多信息.