Is it possible to flatten MongoDB result query?
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?
Solution 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
Solution 2:
Done it much simpler way, maybe it is recent
db.countries.aggregate({$unwind:'$data.country.neighbor.name'})