2017-02-18 9 views
2

Как создать агрегированную операцию, которая показывает мне 5 для каждого тип? Например, мне нужно показать 5 из type= 1, 5 из type=2 и 5 из type=3.Возврат 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 документов без сортировки в массиве. Если вам необходимо вернуть в ТОП 5 документов в отсортированном порядке, то вы можете ввести $sort трубопровод до группируют документы, которые переупорядочиваем документы Попадая в $group трубопровода по type и dateupdate полей:

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] 
      } 
     } 
    } 
]) 

 Смежные вопросы

  • Нет связанных вопросов^_^