¿Es posible aplanar la consulta de resultados de MongoDB?
Tengo una colección profundamente anidada en mi colección MongoDB.
Cuando corro la siguiente consulta:
db.countries.findOne({},{'data.country.neighbor.name':1,'_id':0})
Termino con este resultado anidado aquí:
{"data" : {
"country" : [
{
"neighbor" : [
{
"name" : "Austria"
},
{
"name" : "Switzerland"
}
]
},
{
"neighbor" : {
"name" : "Malaysia"
}
},
{
"neighbor" : [
{
"name" : "Costa Rica"
},
{
"name" : "Colombia"
}
]
}
]
}}
Ahora, esto es lo que quiero:
['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']
O esto:
{'name':['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']}
O cualquier otra cosa similar... Es esto posible?
28
2 answers
Puede utilizar $project
& $unwind
& $group
de marco de agregación para obtener el resultado más cerca de su requisito.
> 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
se usa dos veces ya que la matriz de nombres está anidada profundamente. Y solo funcionará si el atributo neighbor
es un array. En su ejemplo, un campo vecino (Malasia) no es un array
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/ajaxhispano.com/template/agent.layouts/content.php on line 61
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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-08 03:34:14
Es bastante sencillo bajo el nuevo marco de agregación . La operación project project y unwind unwind son adecuadas para el propósito.
-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/ajaxhispano.com/template/agent.layouts/content.php on line 61
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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-08 03:06:20