I mongoDB 3.2 du kan utföra detta genom att använda den samlade frågan i följande form:
db.collection.aggregate(
{$sort: {created: -1}},
{$group: {_id:'$city', title:{$push: '$title'}},
{$project: {_id:0, city: '$_id', mostRecentTitle: {$slice: ['$title', 0, 2]}}}
)
Det är mycket svårt att uppnå samma sak med mongoDB 3.0. Ett mycket smutsigt knep finns för att uppnå detta i 3.0. Det innebär ett par steg och annan insamling.
Gör först en sammanställning och mata ut resultatet till en tillfällig samling som heter 'aggr_out'
Fråga:
db.collection.aggregate([
{$sort: {created: -1}},
{$group: {_id:'$city', title:{$push: '$title'}},
{$project: {city: '$_id', mostRecentTitle: '$title'}},
{$out: 'aggr_out'}]
)
Genom att använda ovanstående fråga kommer mostRecentTitle att ha alla de senaste titlarna ordnade från index 0, 1, 2, ... Om du är nöjd med detta resultat använder du detta eftersom du redan har resultatet i index 0,1 och 2 av mostRecentTitle. Andra titlar kan enkelt ignoreras på applikationssidan.
Om du fortfarande inte är nöjd, gör en uppdatering av utdatasamlingen 'aggr_out' och läs data från denna samling. Frågan är,
db.aggr_out.update(
{},
{$push: {
mostRecentTitle: {$each:[], $slice:3}
}
}
)
Ovanstående operation delar upp arrayen mostRecentTitle så att den har de tre senaste titlarna. Läs igenom denna samling för att få önskat resultat.