【问题标题】:Mongo Aggregation grouping subdocumentMongo Aggregation 分组子文档
【发布时间】:2014-01-02 09:28:51
【问题描述】:

我在使用 MongoDB 的聚合框架做一些看似简单的事情时有点卡住了。

想象一下你的文档看起来像这样:

[
    { a: 1, b: 2 },
    { a: 1, b: 3 },
    { a: 5, b: 6 }
]
  • 如何按字段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
                }
            ]
        }
    ]
}

我尝试过这样的事情:

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
        }
    }
]));

但在我进行的不同测试中,它不断覆盖之前的小组赛结果,错误地计算总和等等。

所以我不太确定如何解决这个问题。

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案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'
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 2012-09-27
      • 1970-01-01
      • 2020-07-01
      • 2018-01-07
      • 1970-01-01
      • 2013-09-12
      相关资源
      最近更新 更多