【问题标题】:Aggregate nested documents in parent document在父文档中聚合嵌套文档
【发布时间】:2018-07-14 02:48:10
【问题描述】:

我有以下数据:

{ 
    "make" : "Toyota", 
    "name" : "Corolla", 
    "year" : "2012"
    "color" : "Blue"
}
{ 
    "make" : "Toyota", 
    "name" : "Camry", 
    "year" : "2016"
    "color" : "Blue"
}
{ 
    "make" : "Toyota", 
    "name" : "Prius", 
    "year" : "2012"
    "color" : "Black"
}
{ 
    "make" : "Nissan", 
    "name" : "PathFinder", 
    "year" : 2012.0
    "color" : "Black"
}
{ 
    "make" : "Nissan", 
    "name" : "Qashqai", 
    "year" : 2011.0
    "color" : "Black"
}
{ 
    "make" : "Nissan", 
    "name" : "X-Trail", 
    "year" : 2009.0
    "color" : "Blue"
}

我想编写一个聚合查询来按make 分组,然后在make 组中按color 分组。

所以我想要的结果的摘录看起来像这样

[{
    _id: "Toyota"
    colors: [
        {
            _id: "Black"
            cars: [{
                "make" : "Toyota", 
                "name" : "Prius", 
                "year" : "2012"
                "color" : "Black"
            }]
        },
        {
            _id: "Blue"
            cars:[{ 
                "make" : "Toyota", 
                "name" : "Corolla", 
                "year" : "2012"
                "color" : "Blue"
            },
            { 
                "make" : "Toyota", 
                "name" : "Camry", 
                "year" : "2016"
                "color" : "Blue"
            }]
        }
    ]
},
{
.... Nissan cars
}]

我已经尝试了以下管道并且已经有点接近我想要的结果,但它并不理想

db.Cars.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $group: {
                _id: {make: '$make', color: '$color'},
                cars: {$push: '$$CURRENT'}
            }
        },

        // Stage 2
        {
            $group: {
                _id: '$_id.make',
                colors: {$push: '$$CURRENT'}
            }
        },
    ]
);

这会导致(注意颜色的 _id 字段):

[{ 
    "_id" : "Toyota", 
    "colors" : [
        {
            "_id" : {
                "make" : "Toyota", 
                "color" : "Black"
            }, 
            "cars" : [
                {
                    "make" : "Toyota", 
                    "name" : "Prius", 
                    "year" : "2012", 
                    "color" : "Black"
                }
            ]
        }, 
        {
            "_id" : {
                "make" : "Toyota", 
                "color" : "Blue"
            }, 
            "cars" : [
                {
                    "make" : "Toyota", 
                    "name" : "Corolla", 
                    "year" : "2012", 
                    "color" : "Blue"
                }, 
                {
                    "make" : "Toyota", 
                    "name" : "Camry", 
                    "year" : "2016", 
                    "color" : "Blue"
                }
            ]
        }
    ]
}
...
]

任何关于编写查询以使输出更接近所需结果的帮助都会很好

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    $project$addFields 阶段添加到$map colors._id from colors._id.color

    管道

    db.cars.aggregate(
        [
            {
                $group: {
                    _id: {make: '$make', color: '$color'},
                    cars: {$push: '$$CURRENT'}
                }
            },
            {
                $group: {
                    _id: '$_id.make',
                    colors: {$push: '$$CURRENT'}
                }
            },
            {$project : {colors : {$map : {input : "$colors", as : "color", in : { "_id" : "$$color._id.color", cars : "$$color.cars" }}}}}
    
        ]
    ).pretty()
    

    输出

    >db.cars.aggregate( [ {$project : {_id : 0}}, { $group: { _id: {make: '$make', color: '$color'}, cars: {$push: '$$CURRENT'} } }, { $group: { _id: '$_id.make', colors: {$push: '$$CURRENT'} } }, {$project : {colors : {$map : {input : "$colors", as : "color", in : { "_id" : "$$color._id.color", cars : "$$color.cars" }}}}} ] ).pretty()
    
    {
        "_id" : "Toyota",
        "colors" : [
            {
                "_id" : "Black",
                "cars" : [
                    {
                        "make" : "Toyota",
                        "name" : "Prius",
                        "year" : "2012",
                        "color" : "Black"
                    }
                ]
            },
            {
                "_id" : "Blue",
                "cars" : [
                    {
                        "make" : "Toyota",
                        "name" : "Corolla",
                        "year" : "2012",
                        "color" : "Blue"
                    },
                    {
                        "make" : "Toyota",
                        "name" : "Camry",
                        "year" : "2016",
                        "color" : "Blue"
                    }
                ]
            }
        ]
    }
    ....//output omitted
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-11
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 2018-07-22
      • 2021-12-13
      • 2020-03-08
      相关资源
      最近更新 更多