sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo obtener los últimos N registros de cada grupo en mongodb?

En mongoDB 3.2 puede realizar esto utilizando la consulta agregada de la siguiente forma:

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

Es muy difícil lograr lo mismo usando mongoDB 3.0. Existe un truco muy sucio para lograr esto en 3.0. Se trata de un par de pasos y otro de recogida.

Primero haga un agregado y envíe el resultado a una colección temporal llamada 'aggr_out'

Consulta:

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

Usando la consulta anterior, mostRecentTitle tendrá todos los títulos recientes ordenados desde el índice 0, 1, 2, ... Si está satisfecho con este resultado, use esto porque ya tiene el resultado en los índices 0,1 y 2 de mostRecentTitle. Otros títulos pueden ser simplemente ignorados en el lado de la aplicación.

Aún así, si no está satisfecho, actualice la colección de salida 'aggr_out' y lea los datos de esta colección. La consulta es,

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

La operación anterior dividirá la matriz mostRecentTitle para que tenga los tres títulos más recientes. Lea esta colección para obtener el resultado deseado.