W mongoDB 3.2 możesz to zrobić za pomocą zapytania zbiorczego o następującej formie:
db.collection.aggregate(
{$sort: {created: -1}},
{$group: {_id:'$city', title:{$push: '$title'}},
{$project: {_id:0, city: '$_id', mostRecentTitle: {$slice: ['$title', 0, 2]}}}
)
Bardzo trudno jest osiągnąć to samo za pomocą mongoDB 3.0. Aby to osiągnąć w wersji 3.0, istnieje bardzo brudna sztuczka. Obejmuje kilka kroków i inną kolekcję.
Najpierw wykonaj agregację i wyślij wynik do tymczasowej kolekcji o nazwie 'aggr_out'
Zapytanie:
db.collection.aggregate([
{$sort: {created: -1}},
{$group: {_id:'$city', title:{$push: '$title'}},
{$project: {city: '$_id', mostRecentTitle: '$title'}},
{$out: 'aggr_out'}]
)
Używając powyższego zapytania, mostRecentTitle będzie miał wszystkie ostatnie tytuły uporządkowane według indeksu 0, 1, 2, ... Jeśli jesteś zadowolony z tego wyniku, używając tego, ponieważ masz już wynik w indeksach 0,1 i 2 mostRecentTitle. Inne tytuły można po prostu zignorować po stronie aplikacji.
Jeśli jednak nie jesteś zadowolony, zaktualizuj kolekcję danych wyjściowych 'aggr_out' i odczytaj dane z tej kolekcji. Zapytanie brzmi,
db.aggr_out.update(
{},
{$push: {
mostRecentTitle: {$each:[], $slice:3}
}
}
)
Powyższa operacja podzieli tablicę mostRecentTitle tak, aby zawierała trzy najnowsze tytuły. Przeczytaj tę kolekcję, aby uzyskać pożądany rezultat.