2017-02-18 46 views
2

如何創建一個聚合操作,爲每個類型顯示5? 例如,我需要的是顯示type= 1中的5個,type=2中的5個和type=3中的5個。返回5個元素用於每種類型的聚合

我曾嘗試:

db.items.aggregate([ 
    {$match : { "type" : { $gte:1,$lte:3 }}}, 
    {$project: { "type": 1, "subtipo": 1, "dateupdate": 1, "latide": 1, "long": 1, "view": 1,month: { $month: "$dateupdate" } }}, 
    {$sort:{view: -1, dateupdate: -1}}, 
    {$limit:5} 
]); 

回答

2

$match管道後,你需要做它創建的原始文件的陣列初始組。之後,您可以$slice與文件數組返回5個元素。

直覺可以遵循在本例中:

db.items.aggregate([ 
    { '$match' : { 'type': { '$gte': 1, '$lte': 3 } } }, 
    {  
     '$group': { 
      '_id': '$type', 
      'docs': { '$push': '$$ROOT' }, 
     } 
    }, 
    { 
     '$project': { 
      'five_docs': { 
       '$slice': ['$docs', 5] 
      } 
     } 
    } 
]) 

上面將返回在數組排序,則5個文檔。

db.items.aggregate([ 
    { '$match' : { 'type': { '$gte': 1, '$lte': 3 } } }, 
    { '$sort': { 'type': 1, 'dateupdate': -1 } }, // <-- re-order here 
    {  
     '$group': { 
      '_id': '$type', 
      'docs': { '$push': '$$ROOT' }, 
     } 
    }, 
    { 
     '$project': { 
      'top_five': { 
       '$slice': ['$docs', 5] 
      } 
     } 
    } 
]) 
:如果你需要返回排序順序的前5名的文件,那麼你可以通過 typedateupdate字段分組的文件漸入 $group流水線重新排序的文檔之前推出 $sort管道
相關問題