Czy możliwe jest spłaszczenie zapytania wynikowego MongoDB?
Mam głęboko zagnieżdżoną kolekcję w mojej kolekcji MongoDB.
Kiedy uruchamiam następujące zapytanie:
db.countries.findOne({},{'data.country.neighbor.name':1,'_id':0})
Kończę z tym zagnieżdżonym wynikiem tutaj:
{"data" : {
"country" : [
{
"neighbor" : [
{
"name" : "Austria"
},
{
"name" : "Switzerland"
}
]
},
{
"neighbor" : {
"name" : "Malaysia"
}
},
{
"neighbor" : [
{
"name" : "Costa Rica"
},
{
"name" : "Colombia"
}
]
}
]
}}
To jest to, czego chcę:
['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']
Lub to:
{'name':['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']}
Lub cokolwiek podobnego... Czy to możliwe?
28
2 answers
Możesz użyć $project
& $unwind
& $group
framework agregacji , aby uzyskać wynik bliższy wymaganiom.
> 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
używany dwukrotnie, ponieważ tablica nazw jest zagnieżdżona głęboko. I będzie działać tylko wtedy, gdy atrybut neighbor
jest tablicą. W twoim przykładzie jedno pole sąsiada (Malezja) nie jest tablicą
40
Author: RameshVel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-08 03:34:14
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-08 03:34:14
To całkiem proste pod nowym Framework agregacji. Operacja $ project i $ unwind są odpowiednie do tego celu.
-3
Author: James Gan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-08 03:06:20
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-08 03:06:20