Is it possible to flatten MongoDB result query?

杀马特。学长 韩版系。学妹 提交于 2019-11-28 17:24:44

问题


I have a deeply nested collection in my MongoDB collection.

When I run the following query:

db.countries.findOne({},{'data.country.neighbor.name':1,'_id':0})

I end up with this nested result here:

{"data" : {
  "country" : [
    {
      "neighbor" : [
        {
          "name" : "Austria"
        },
        {
          "name" : "Switzerland"
        }
      ]
    },
    {
      "neighbor" : {
        "name" : "Malaysia"
      }
    },
    {
      "neighbor" : [
        {
          "name" : "Costa Rica"
        },
        {
          "name" : "Colombia"
        }
      ]
    }
  ]
}}

Now, this is what I want:

['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']

or this:

{'name':['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']}

or anything else similar... Is this possible?


回答1:


You can use $project & $unwind & $group of aggregation framework to get the result closer to your requirement.

> db.countries.aggregate({$project:{a:'$data.country.neighbor.name'}},
                         {$unwind:'$a'},
                         {$unwind:'$a'},
                         {$group:{_id:'a',res:{$addToSet:'$a'}}})
  {
    "result" : [
        {
            "_id" : "a",
            "res" : [
                "Colombia",
                "Malaysia",
                "Switzerland",
                "Costa Rica",
                "Austria"
            ]
        }
    ],
    "ok" : 1
}

$unwind used twice since the name array is nested deep. And It will only work if the neighbor attribute is an array. In your example one neighbor field (Malaysia) is not an array




回答2:


Done it much simpler way, maybe it is recent

db.countries.aggregate({$unwind:'$data.country.neighbor.name'})



回答3:


It's pretty straightforward under the new aggregation framework. The $project and $unwind operation are right for the purpose.



来源:https://stackoverflow.com/questions/13281733/is-it-possible-to-flatten-mongodb-result-query

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!