首页 > 解决方案 > MongoDB 聚合:将数组聚合成键控对象

问题描述

我想使用聚合功能将文档数组展平为键控对象。这是我的文档的示例:

[ 
    {
        "_id": 1,
        "texts": [
            { "language": "english", "text": "hello" },
            { "language": "german", "text": "hallo" },
            { "language": "french", "text": "bonjour" }
        ]
    }, …
]

预期结果:

[
     {
        "_id": 1,
        "texts": {
            "english": "hello",
            "german": "hallo",
            "french": "bonjour"
        }
    }, …
]

我看过不同的运算符,例如$map,但这似乎集中在将数组转换为数组。我可能需要 JS 等价物$reduce,但找不到将我的值累积到对象中的方法。

有任何想法吗?

标签: mongodbaggregation-framework

解决方案


您需要$map$arrayToObject将 kv 对数组转换为单个对象:

db.col.aggregate([
    {
        $addFields: {
            texts: {
                $arrayToObject: {
                    $map: {
                        input: "$texts",
                        as: "text",
                        in: {
                            k: "$$text.language",
                            v: "$$text.text"
                        }
                    }
                }
            }
        }
    }
])

推荐阅读