Mongodb Mongo聚合分组子文档

Mongodb Mongo聚合分组子文档,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我一直在用MongoDB的聚合框架做一些看似简单的事情 想象一下,您的文档如下所示: [ { a: 1, b: 2 }, { a: 1, b: 3 }, { a: 5, b: 6 } ] printjson(db.getSiblingDB('mydb').mycollection.aggregate([ { $project: { a: 1, b: 1 } }, {

我一直在用MongoDB的聚合框架做一些看似简单的事情

想象一下,您的文档如下所示:

[
    { a: 1, b: 2 },
    { a: 1, b: 3 },
    { a: 5, b: 6 }
]
printjson(db.getSiblingDB('mydb').mycollection.aggregate([
    {
        $project: {
            a: 1,
            b: 1
        }
    },
    {
        $group: {
            _id: {
                a: '$a'
            },
            sum_a: {
                $sum: 1
            },
            b: {
                $first: '$b'
            }
        }
    },
    {
        $group: {
            _id: {
                b: '$b'
            },
            sum_b: {
                $sum: 1
            }
        }
    },
    {
        $sort: {
            sum_a: 1
        }
    }
]));
  • 如何按字段
    a
    对文档进行分组,然后按另一个字段(如
    b
    )重新分组子文档,同时仍计算每个步骤的文档总数
对于我们的示例,结果如下所示:

{
    results: [
        {
            _id: {
                a: 1
            },
            sum_a: 2,
            doc_a: [
                {
                    _id: {
                        b: 2
                    },
                    sum_b: 1
                },
                {
                    _id: {
                        b: 3
                    },
                    sum_b: 1
                }
            ]
        },
        {
            _id: {
                a: 5
            },
            sum_a: 1,
            doc_a: [
                {
                    _id: {
                        b: 6
                    },
                    sum_b: 1
                }
            ]
        }
    ]
}
我试过这样的方法:

[
    { a: 1, b: 2 },
    { a: 1, b: 3 },
    { a: 5, b: 6 }
]
printjson(db.getSiblingDB('mydb').mycollection.aggregate([
    {
        $project: {
            a: 1,
            b: 1
        }
    },
    {
        $group: {
            _id: {
                a: '$a'
            },
            sum_a: {
                $sum: 1
            },
            b: {
                $first: '$b'
            }
        }
    },
    {
        $group: {
            _id: {
                b: '$b'
            },
            sum_b: {
                $sum: 1
            }
        }
    },
    {
        $sort: {
            sum_a: 1
        }
    }
]));
但在我做的不同测试中,它总是覆盖以前的小组阶段结果,错误地计算总数等等


因此,我真的不知道如何解决这个问题。

如果您按主字段('a')和子字段('b')分组,然后只按'a'(第一步的计数求和)分组,并将'b'推入数组(从第一步复制计数),它应该会产生您需要的结果:

{
    $group : {
        _id : {
            a : '$a',
            b : '$b'
        },
        count : {
            $sum : 1
        }
    }
},{
    $group : {
        _id : {
            a : '$_id.a'
        },
        count_a : {$sum: '$count'},
        doc_a : {
            $push : {
                b : '$_id.b',
                count_b : '$count'
            }
        }
    }
}