web-dev-qa-db-fra.com

Est-il possible d'aplatir la requête de résultat MongoDB?

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?

38
Gevorg

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

54
RameshVel

Fait de manière beaucoup plus simple, peut-être que c'est récent

db.countries.aggregate({$unwind:'$data.country.neighbor.name'})
1
wadouk