MongoDB聚合函数的替代查询

时间:2015-06-26 21:35:06

标签: mongodb aggregation-framework

以下是我正在处理的示例数据:

{
    "_id": 1,
    "user": A,
    "nums":[1,2,3,4]
}
{
    "_id": 2,
    "user": B,
    "nums":[1,2,4]
}
{
    "_id": 3,
    "user": B,
    "nums":[4,5,7]
}

我想要得到的是每个用户的日志数量以及每个用户的不同“nums”列表。所以结果是这样的:

[
    {
        "user": A,
        "total": 1,
        "nums" : [1,2,3,4]
    },
    {
        "user": B,
        "total": 2,
        "nums" : [1,2,4,5,7]
    }
]

这可以在一个聚合查询中实现吗?我现在正在使用两个。

db.test.aggregate([{ $group: { _id:"$user", total:{$sum:1}}}])
db.test.aggregate([{$unwind:"$nums"}, { $group: { _id:"$user", nums:{$addToSet:"$nums"}}}])

另外,如果一个查询比大数据集上的两个单独查询要快,或者我应该只使用两个查询?

1 个答案:

答案 0 :(得分:2)

您可以通过在_id之后的$group中的文档中汇总原始$unwind值列表来实现此目的,从而提供获取最终总数的方法{ {1}}:

$project

结果:

db.test.aggregate([
    {$unwind: '$nums'},
    {$group: {
        _id: '$user',
        ids: {$addToSet: '$_id'},
        nums: {$addToSet: '$nums'}
    }},
    {$project: {
        _id: 0,
        user: '$_id',
        total: {$size: '$ids'},
        nums: 1
    }}
])

我希望在一个[ { "nums": [ 7, 5, 4, 2, 1 ], "user": "B", "total": 2 }, { "nums": [ 4, 3, 2, 1 ], "user": "A", "total": 1 } ] 管道而不是两个管道中完成所有操作会更快,但最好在您自己的环境中测试它以确保。