首页 > 解决方案 > 将嵌套对象字段合并到 MongoDB 聚合中的单个嵌套数组字段中

问题描述

作为我的聚合管道的一部分,我有以下场景。这是对每个文档中先前展开的字段进行分组的结果(因此在这种情况下,有两个文档具有相同的 _id 但具有不同的 UniqueFieldName 值)

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

我要做的就是将嵌套对象字段合并到一个字段中,并将所有值作为数组推送到该字段中,就像这样。

    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 阶段使用点表示法会引发错误。看来 mongo 不喜欢用这样的嵌套对象分组?

简单的解决方案是将 TopLevelField 更改为这样的嵌套字段的串联,

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

但这对我的用例来说不是最理想的。是否有解决方案,还是我需要重新考虑整个管道?

标签: arraysmongodbobjectaggregategrouping

解决方案


你可以试试这个:

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-游乐场


推荐阅读