2016-06-16 175 views
3

比方说,我们有一个文档集合如下MongoDB的总文档

{_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. 组文件对于每个类别,按数量递减排列前两位文件

    因此,在第是的情况下,预期的结果应该是这样的

    [ 
        {_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. 重复查找{类别:X},{排序: [[ '计数', '降序']],限制:2}命令
    3. 合并的结果到一个共同的阵列

    反正有一个请在"aggregation"的方式下点击这个?

  • +0

    你试过做任何查询吗? – Shrabanee

    +0

    目前我正在采取多个步骤来处理这个问题。 – Lee

    +1

    无论如何,我想出了一个答案。感谢所有的赞成票和评论。将在短时间内发布答案。 – Lee

    回答

    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工作tegether玩的小伎俩。