首页 > 解决方案 > 使用聚合的 MongoDB 数组转换

问题描述

如何使用 MongoDB 聚合管道展开多个数组并将它们组合成一个数组。

输入:

    "_id" : ObjectId("5d8605c9a9410a0e3ca50f12"),
    "fourWheeler" : {
        "cars" : [
            {
                "make": "Honda",
                "model": "Accord",
                "year": 2010
            },
            {
                "make": "Toyota",
                "model": "Camry",
                "year": 2012
            }
        ]
    },
    "twoWheeler" : {
        "motorBikes" : [
            {
                "make": "Suzuki",
                "model": "Hayabusa",
                "year": 2018
            },
            {
                "make": "Yamaha",
                "model": "FZ1",
                "year": 2005
            }
        ]
    }
}

我希望将上述内容转换为以下内容: *最好按年份排序。如您所见,将新键车辆分配给组合数组,现有键已移动到相应的数组元素。

{
    "_id" : ObjectId("5d8605c9a9410a0e3ca50f12"),
    "vehicles" : [
            {
                "make": "Honda",
                "model": "Accord",
                "year": 2010,
                "category": "fourWheeler"
            },
            {
                "make": "Toyota",
                "model": "Camry",
                "year": 2012,
                "category": "fourWheeler"
            },
            {
                "make": "Suzuki",
                "model": "Hayabusa",
                "year": 2018,
                "category": "twoWheeler"
            },
            {
                "make": "Yamaha",
                "model": "FZ1",
                "year": 2005,
                "category": "twoWheeler"
            }            
    ]
}

标签: mongodbtransformationaggregation

解决方案


以下查询可以为我们提供预期的输出:

db.collection.aggregate([
    {
        $addFields:{
            "fourWheeler.cars.category":"fourWheeler",
            "twoWheeler.motorBikes.category":"twoWheeler"   
        }
    },
    {
        $project:{
            "vehicles":{
                $concatArrays:["$fourWheeler.cars","$twoWheeler.motorBikes"]
            }
        }
    }
]).pretty()

数据集:

{
    "_id" : ObjectId("5d8605c9a9410a0e3ca50f12"),
    "fourWheeler" : {
        "cars" : [
            {
                "make" : "Honda",
                "model" : "Accord",
                "year" : 2010
            },
            {
                "make" : "Toyota",
                "model" : "Camry",
                "year" : 2012
            }
        ]
    },
    "twoWheeler" : {
        "motorBikes" : [
            {
                "make" : "Suzuki",
                "model" : "Hayabusa",
                "year" : 2018
            },
            {
                "make" : "Yamaha",
                "model" : "FZ1",
                "year" : 2005
            }
        ]
    }
}

输出:

{
    "_id" : ObjectId("5d8605c9a9410a0e3ca50f12"),
    "vehicles" : [
        {
            "make" : "Honda",
            "model" : "Accord",
            "year" : 2010,
            "category" : "fourWheeler"
        },
        {
            "make" : "Toyota",
            "model" : "Camry",
            "year" : 2012,
            "category" : "fourWheeler"
        },
        {
            "make" : "Suzuki",
            "model" : "Hayabusa",
            "year" : 2018,
            "category" : "twoWheeler"
        },
        {
            "make" : "Yamaha",
            "model" : "FZ1",
            "year" : 2005,
            "category" : "twoWheeler"
        }
    ]
}

推荐阅读