mongodb将整个集合中的嵌套值与计数进行聚合

时间:2017-03-03 17:59:57

标签: mongodb mongodb-query aggregation-framework

我有以下结构的文件:

{
    _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,
        }]
    }
}

散列是值和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很新,并且为了获得任何有意义的输出而无法获得聚合管道阶段。

如果您认为有更好的方法,也欢迎有关构建此数据的评论。

1 个答案:

答案 0 :(得分:2)

你的结构看起来很好。您可以根据需要删除哈希值,并使用valuestack_trace作为分组键。

您可以使用以下聚合。

对于$group hash,您需要$unwind exceptions嵌入数组,然后$first保留value和{ {1}}和stack_trace不计算明显的异常。

$sum