Слияние полей вложенных объектов в одно поле вложенного массива в MongoDB Aggregation - PullRequest
1 голос
/ 12 февраля 2020

В рамках моего конвейера агрегации у меня следующий сценарий. Это результат группировки ранее развернутых полей из каждого документа (поэтому в этом случае есть два документа с одинаковым _id, но с другим значением для UniqueFieldName)

    TopLevelField: [
        {
            UniqueFieldName: "Values go here!"
        },
        {
            UniqueFieldName: "More values go here too!"
        }
    ]

Все, что я хочу сделать, это объединить вложенные поля объекта в одно поле и pu sh все значения в это поле в виде массива, например, так.

    TopLevelField: {
        UniqueFieldName: [
             "Values go here!",
             "More values go here too!",
        ],
    }

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

    TopLevelField: {
        UniqueFieldName: [
             "Values go here!",
             "More values go here too!",
        ],
        SecondFieldName: [
             "This is text",
        ],
        AnotherOne: [
             "TEXT",
             "Here too!",
             "More values",
        ],
    }

Проблема, с которой я сталкиваюсь, состоит в том, что при попытке использовать точечную нотацию на этапе $ group выдается ошибка. Кажется, что mon go не любит группировать с вложенными объектами, как это?

Простое решение состоит в том, чтобы просто изменить TopLevelField на некоторую конкатенацию вложенных полей, как это,

    TopLevelField-UniqueFieldName: [
         "Values go here!",
         "More values go here too!",
    ],
    TopLevelField-SecondFieldName: [
         "This is text",
    ],
    TopLevelField-AnotherOne: [
         "TEXT",
         "Here too!",
         "More values",
    ],

Но это неоптимально для моего варианта использования. Есть ли решение для этого или мне нужно переосмыслить весь конвейер?

1 Ответ

0 голосов
/ 14 февраля 2020

Вы можете попробовать это:

db.collection.aggregate([
    { $unwind: '$TopLevelField' },
    {
        $group: {
            _id: '', 'UniqueFieldName': { $push: '$TopLevelField.UniqueFieldName' },
            'UniqueFieldName2': { $push: '$TopLevelField.UniqueFieldName2' },
            'UniqueFieldName3': { $push: '$TopLevelField.UniqueFieldName3' },
            'UniqueFieldName4': { $push: '$TopLevelField.UniqueFieldName4' }
        }
    }, { $project: { _id: 0 } }, { $project: { 'TopLevelField': '$$ROOT' } }])

Тест: MongoDB-Playground

...