Подтвердить что ты не робот

Возможно ли разрезать результат запроса MongoDB?

У меня есть глубоко вложенная коллекция в моей коллекции MongoDB.

Когда я запускаю следующий запрос:

db.countries.findOne({},{'data.country.neighbor.name':1,'_id':0})

В итоге я получаю этот вложенный результат:

{"data" : {
  "country" : [
    {
      "neighbor" : [
        {
          "name" : "Austria"
        },
        {
          "name" : "Switzerland"
        }
      ]
    },
    {
      "neighbor" : {
        "name" : "Malaysia"
      }
    },
    {
      "neighbor" : [
        {
          "name" : "Costa Rica"
        },
        {
          "name" : "Colombia"
        }
      ]
    }
  ]
}}

Теперь это то, что я хочу:

['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']

или это:

{'name':['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']}

или что-нибудь еще подобное... Возможно ли это?

4b9b3361

Ответ 1

Вы можете использовать $project и $unwind и $group структуры aggregation, чтобы получить результат ближе к вашему требованию.

> 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 используется дважды, так как массив имен вложен глубоко. И он будет работать, только если атрибут neighbor - это массив. В вашем примере одно соседнее поле (Малайзия) не является массивом

Ответ 2

Сделано это намного проще, может быть, это недавно

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

Ответ 3

Это довольно просто в рамках новой структуры агрегации. Для этой цели подходят операции $project и $unwind.