Zakładając, że masz zainstalowaną najnowszą wersję mongodb, jednym ze sposobów na zrobienie tego jest:
Sort
rekordy na podstawiepublished_date
w porządku malejącym.group
rekordy na podstawie ichcategory
. Dla każdej grupy zbierz wszystkie rekordy razem w tablicy.- W kodzie javascript/po stronie klienta
slice
5 najlepszych rekordów z każdej grupy (kategorii).
$slice
nie jest dostępny po stronie serwera $project
operator potoku agregacji, który uniemożliwia nam wykonanie operacji po stronie serwera.
var result = db.collection.aggregate(
[
{$sort:{"published_date":-1}},
{$group:{"_id":"$category","values":{$push:"$$ROOT"}}}
]
).map(function(doc){
return {"category":doc._id,"records":doc.values.slice(0,5)};
});
result
zmienna będzie teraz tablicą dokumentów. Każdy dokument reprezentujący każdą category
i z kolei mając tablicę najlepszych 5
rekordy.