MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come ottenere gli ultimi N record di ciascun gruppo in mongodb?

In mongoDB 3.2 puoi eseguire questa operazione utilizzando la query aggregata del seguente modulo:

db.collection.aggregate(
  {$sort: {created: -1}},
  {$group: {_id:'$city', title:{$push: '$title'}},
  {$project: {_id:0, city: '$_id', mostRecentTitle: {$slice: ['$title', 0, 2]}}}
)

È molto difficile ottenere lo stesso risultato usando mongoDB 3.0. Un trucco molto sporco è lì per raggiungere questo obiettivo in 3.0. Implica un paio di passaggi e altre raccolte.

Per prima cosa esegui un'aggregazione e invia il risultato a una raccolta temporanea chiamata 'aggr_out'

Query:

db.collection.aggregate([
  {$sort: {created: -1}},
  {$group: {_id:'$city', title:{$push: '$title'}},
  {$project: {city: '$_id', mostRecentTitle: '$title'}},
  {$out: 'aggr_out'}]
)

Usando la query precedente, mostRecentTitle avrà tutti i titoli recenti ordinati dall'indice 0, 1, 2, ... Se sei soddisfatto di questo risultato usando questo perché hai già il risultato negli indici 0,1 e 2 di mostRecentTitle. Altri titoli possono essere semplicemente ignorati dal lato dell'applicazione.

Tuttavia, se non sei soddisfatto, esegui un aggiornamento sulla raccolta di output 'aggr_out' e leggi i dati da questa raccolta. La domanda è,

db.aggr_out.update(
  {},
  {$push: {
    mostRecentTitle: {$each:[], $slice:3}
    }
  }
)

L'operazione precedente taglierà l'array mostRecentTitle in modo che abbia i tre titoli più recenti. Leggi questa raccolta per ottenere il risultato desiderato.