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