MongoDB汇总文档

时间:2016-06-16 06:34:17

标签: mongodb aggregation-framework nosql

我们假设我们有一个包含以下文件的集合

{_id:1, name:'a', category:'c1', count:1}
{_id:2, name:'b', category:'c1', count:3}
{_id:3, name:'c', category:'c1', count:5}
{_id:4, name:'d', category:'c2', count:2}
{_id:5, name:'e', category:'c2', count:3}
{_id:6, name:'f', category:'c2', count:6}
{_id:7, name:'g', category:'c2', count:7}

我试图构建某种"aggregation"管道

  1. 按类别分组文件
  2. 对于每个类别,按降序计算返回前2个文档
  3. 所以在这种情况下,预期的结果应该是

    [
        {_id:'c1: docs:[
            {_id:3, name:'c', category:'c1', count:5},
            {_id:2, name:'b', category:'c1', count:3}
        ]},
        {_id:'c2: docs:[
            {_id:7, name:'g', category:'c2', count:7},
            {_id:6, name:'f', category:'c2', count:6}
        ]},        
    ]
    

    目前,我采取了多个步骤来生成结果

    1. 识别类别列表
    2. 重复查找{category:x},{sort:[[' count',' desc']],限制:2}命令
    3. 将结果合并到一个公共数组
    4. 无论如何以"aggregation"方式实现这一目标?

1 个答案:

答案 0 :(得分:0)

管理自己找出答案。它是如下所示。

collection.aggregate([
    {$sort:{category:1, count:-1}},
    {$group:{_id:'$category', docs:{$push:{_id:'$_id', name:'$name', count:'$count'}}}},
    {$project:{_id:1, docs:{$slice:['$docs', 2]}}}
])

$sort$push$slice共同努力发挥技巧。