Использование $ project для изменения структуры данных, возвращаемых в MongoDB - PullRequest
0 голосов
/ 04 октября 2018

У меня есть функция в моем бэкэнде MongoDB / Node, которая возвращает список отделов.

Документы в коллекции выглядят так:

[
    {
      _id: 111,
      department: "abc"
    },
    {
      _id: 222,
      department: "def"
    },
    {
      _id: 333,
      department: "ghi"
    }
]

Это работает с агрегированными взглядамикак это:

  $group: {
    _id: null,
    data: { $addToSet: "$department" }
  }

Однако то, что это производит, не идеально.Выходные данные выглядят так:

{
    "count": 1,
    "data": [
        {
            "_id": null,
            "data": [
                "abc",
                "def",
                "ghi"
            ]
        }
    ]
}

Что я хотел бы сделать, это вернуть данные, где нет структуры вложенного массива с «данными» внутри «данных».Мне бы хотелось, чтобы этот вывод:

{
  "count": 1,
  "data": [
    "abc",
    "def",
    "ghi",
  ]
}

Есть ли способ, которым я могу сделать это на этапе проецирования?

Я пробовал это:

  {
    $group: {
      _id: null,
      data: { $addToSet: "$department" }
    }
  },
  {
    $project: {
      data: 0,
      _id: 0
    }
  }

Но конецс той же структурой данных.Есть ли способ, которым я могу сделать это с $project?

ОБНОВЛЕНИЕ:

После предложения я попробовал это:

db.staffmembers.aggregate([
      {
        $group: {
          _id: null,
          data: { $addToSet: "$department" }
        }
      },
      {
        $project: {
          data: {
            $reduce: {
              input: "$data.data",
              initialValue: [],
              in: {
                $concatArrays: ["$$this", "$$value"]
              }
            }
          }
        }
      }
    ]);

... но это выводитпустой массив для data:

{ 
    "_id" : null, 
    "data" : [

    ]
}

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Это то, что вам нужно:

db.collection.aggregate({
    $project: {
        data: { $arrayElemAt: [ "$data.data", 0 ] },
        _id: 0
    }
})

Имейте в виду, у меня есть ощущение, что в вашем конвейере и / или настройке данных есть что-то странное.Вероятно, было бы полезно, если бы вы могли поделиться входными данными и всем конвейером.

0 голосов
/ 04 октября 2018

Вы можете использовать стадию $project в своем конвейере, чтобы выбрать то, что требуется от предыдущей стадии агрегации

db.staffmembers.aggregate([
    {
        $group:{
            _id:null,
            data:{$addToSet:"$department"}
        }
    },
    {
        $project:{
            data:1,
            _id:0
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...