J'ai une collection profondément imbriquée dans ma collection MongoDB.
Lorsque j'exécute la requête suivante:
db.countries.findOne({},{'data.country.neighbor.name':1,'_id':0})
Je me retrouve avec ce résultat imbriqué ici:
{"data" : {
"country" : [
{
"neighbor" : [
{
"name" : "Austria"
},
{
"name" : "Switzerland"
}
]
},
{
"neighbor" : {
"name" : "Malaysia"
}
},
{
"neighbor" : [
{
"name" : "Costa Rica"
},
{
"name" : "Colombia"
}
]
}
]
}}
Maintenant, c'est ce que je veux:
['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']
ou ca:
{'name':['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']}
ou toute autre chose similaire ... Est-ce possible?
Vous pouvez utiliser $project
& $unwind
& $group
of agrégation framework pour rapprocher le résultat de vos besoins.
> 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
utilisé deux fois car le tableau de noms est imbriqué profondément. Et cela ne fonctionnera que si l'attribut neighbor
est un tableau. Dans votre exemple, un champ voisin (Malaisie) n'est pas un tableau
Fait de manière beaucoup plus simple, peut-être que c'est récent
db.countries.aggregate({$unwind:'$data.country.neighbor.name'})