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?

Author: Gevorg, 2012-11-08

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

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