Is it possible to flatten MongoDB result query?

MongodbMongodb QueryFlatten

Mongodb Problem Overview


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?

Mongodb Solutions


Solution 1 - Mongodb

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

Solution 2 - Mongodb

Done it much simpler way, maybe it is recent

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

Solution 3 - Mongodb

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMarsellus WallaceView Question on Stackoverflow
Solution 1 - MongodbRameshVelView Answer on Stackoverflow
Solution 2 - MongodbwadoukView Answer on Stackoverflow
Solution 3 - MongodbJames GanView Answer on Stackoverflow