V mongoDB 3.2 můžete to provést pomocí agregačního dotazu následujícího formuláře:
db.collection.aggregate(
{$sort: {created: -1}},
{$group: {_id:'$city', title:{$push: '$title'}},
{$project: {_id:0, city: '$_id', mostRecentTitle: {$slice: ['$title', 0, 2]}}}
)
Je velmi obtížné dosáhnout stejného pomocí mongoDB 3.0. Existuje velmi špinavý trik, jak toho dosáhnout ve 3.0. Zahrnuje několik kroků a další sběr.
Nejprve proveďte agregaci a výsledek vytiskněte do dočasné kolekce s názvem 'aggr_out'
Dotaz:
db.collection.aggregate([
{$sort: {created: -1}},
{$group: {_id:'$city', title:{$push: '$title'}},
{$project: {city: '$_id', mostRecentTitle: '$title'}},
{$out: 'aggr_out'}]
)
Pomocí výše uvedeného dotazu bude mít mostRecentTitle všechny poslední názvy seřazené z indexu 0, 1, 2, ... Pokud jste s tímto výsledkem spokojeni, protože již máte výsledek v indexech 0,1 a 2 mostuRecentTitle. Ostatní názvy lze na straně aplikace jednoduše ignorovat.
Pokud přesto nejste spokojeni, proveďte aktualizaci výstupní kolekce 'aggr_out' a přečtěte si data z této kolekce. Dotaz je,
db.aggr_out.update(
{},
{$push: {
mostRecentTitle: {$each:[], $slice:3}
}
}
)
Výše uvedená operace rozdělí pole mostRecentTitle tak, aby obsahovalo poslední tři tituly. Přečtěte si tuto kolekci, abyste dosáhli požadovaného výsledku.