【问题标题】:mongodb aggregating nested values across whole collection with countsmongodb用计数聚合整个集合中的嵌套值
【发布时间】:2017-03-03 17:59:57
【问题描述】:

我有以下结构的文档:

{
    _id: 123,
    machine_id: 456,
    data: {
        some_data: 100,
        exceptions: [{
            hash: 789,
            value: 'something',
            stack_trace: 'line 123: oops',
            count: 5,
        }]
    }
}

{
    _id: 234,
    machine_id: 567,
    data: {
        some_other_data: 200,
        exceptions: [{
            hash: 789,
            value: 'something',
            stack_trace: 'line 123: oops',
            count: 1,
        }, {
            hash: 890,
            value: 'something_else',
            stack_trace: 'line 678: ouch',
            count: 3,
        }]
    }
}

哈希是 value 和 stack_trace 的组合(我专门添加了这个以尝试在整个集合中聚合异常)。我想运行一个查询,该查询返回每个不同的异常,以及总计数、值和堆栈跟踪。在这种情况下,结果将类似于:

[{
    hash: 789,
    value: 'something',
    stack_trace: 'line123: oops',
    count: 6,
}, {
    hash: 890,
    value: 'something_else',
    stack_trace: 'line 678: ouch',
    count: 3,
}]

我对 mongoDB 很陌生,并且正在努力获得聚合管道阶段以提供任何有意义的输出。

如果您认为有更好的方法,也欢迎 cmets 构建这些数据。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    你的结构看起来不错。如果需要,您可以删除散列并使用 value 和 stack_trace 作为分组键。

    您可以使用以下聚合。

    对于$grouping on hash,您需要在$unwind exceptions 嵌入数组后跟$first 以保留value 和stack_trace 和$sum 以计算不同异常的数量.

    db.collection.aggregate(
    {$unwind:"$data.exceptions"}, 
    {$group:{_id:"$data.exceptions.hash", value:{$first:"$data.exceptions.value"}, stack_trace:{$first:"$data.exceptions.stack_trace"}, count:{$sum:"$data.exceptions.count"}}})
    

    【讨论】:

    • 谢谢!这是我错过的最初的“$unwind”!
    • 看你似乎很擅长这个.. 我也可以问你快速计算集合中所有异常总数的最有效方法吗?我还应该使用聚合吗?类似:collection.aggregate([ {'$unwind': '$data.exceptions'}, {'$group': { '_id': None, 'count': {'$sum': '$data.exceptions .count'} }}, ])
    • 这似乎是正确的,或者您可以使用db.collection.distinct("data.exceptions.count") 将给您[5,1,3],您可以使用您的语言应用 sum。例如在 JS 中你可以做 sum = [5,1,3].reduce((a, b) => a+b, 0);
    • 我实际上认为这不起作用,因为如果您有相同计数的不同异常,您只会在“不同”结果集中看到其中一个计数。
    • 对不起,你是对的。我只是太急于提供替代选择而没有注意您的要求。所以继续使用聚合选项。
    猜你喜欢
    • 1970-01-01
    • 2019-07-20
    • 2015-03-10
    • 2017-07-26
    • 2021-03-13
    • 2020-11-09
    • 1970-01-01
    • 2015-12-06
    • 2017-07-16
    相关资源
    最近更新 更多