Как переместить значения объекта в массив в MongoDB? - PullRequest
1 голос
/ 06 февраля 2020

Я хотел бы выполнить преобразование данных с использованием MongoDB Aggregation Framework. Я застрял на несколько часов и, кажется, не могу обойти это.

Пример входных данных:

{
  a1: "value a1",
  a2: "value a2"
},
{
  a1: "value a3",
  a2: "value a4"
},
{
  a1: "value a5",
  a2: "value a6"
}

Я хотел бы иметь вывод ниже.

{
  a1: ["value a1", "value a3", "value a5"],
  a2: ["value a2", "value a4", "value a6"]
}

1 Ответ

2 голосов
/ 06 февраля 2020

Я предполагаю, что вы хотите запустить такое агрегирование динамически (не зная имен ключей). В таком случае вам нужно начать с $ objectToArray , затем запустить double $ group , чтобы получить массив для каждого ключа, и на последнем шаге вам нужно запустить $ arrayToObject чтобы вернуть имена клавиш в качестве ключей:

db.collection.aggregate([
    {
        $project: {
            doc: {
                $filter: {
                    input: { $objectToArray: "$$ROOT" },
                    cond: { $ne: [ "$$this.k", "_id" ] }
                }
            }
        }
    },
    {
        $unwind: "$doc"
    },
    {
        $group: {
            _id: "$doc.k",
            values: { $push: "$doc.v" }
        }
    },
    {
        $group: {
            _id: null,
            data: { $push: { k: "$_id", v: "$values" } }
        }
    },
    {
        $replaceRoot: {
            newRoot: {
                $arrayToObject: "$data"
            }
        }
    }
])

Пн go Детская площадка

РЕДАКТИРОВАТЬ: проблема становится очень простой, если вы знаете имена клавиши:

db.collection.aggregate([
    {
        $group: {
            _id: null,
            a1: { $push: "$a1" },
            a2: { $push: "$a2" }     
        }
    }
])
...