MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como obter os últimos N registros de cada grupo no mongodb?


No mongoDB 3.2 você pode fazer isso usando a consulta agregada do seguinte formulário:
db.collection.aggregate(
  {$sort: {created: -1}},
  {$group: {_id:'$city', title:{$push: '$title'}},
  {$project: {_id:0, city: '$_id', mostRecentTitle: {$slice: ['$title', 0, 2]}}}
)

É muito difícil conseguir o mesmo usando o mongoDB 3.0. Um truque muito sujo existe para conseguir isso no 3.0. Envolve algumas etapas e outras coletas.

Primeiro faça uma agregação e envie o resultado para uma coleção temporária chamada 'aggr_out'

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

Usando a consulta acima, mostRecentTitle terá todos os títulos recentes ordenados do índice 0, 1, 2, ... Se você estiver satisfeito com este resultado usando isso, pois já tem o resultado nos índices 0,1 e 2 de mostRecentTitle. Outros títulos podem ser simplesmente ignorados no lado do aplicativo.

Ainda assim, se você não estiver satisfeito, faça uma atualização na coleção de saída 'aggr_out' e leia os dados desta coleção. A consulta é,
db.aggr_out.update(
  {},
  {$push: {
    mostRecentTitle: {$each:[], $slice:3}
    }
  }
)

A operação acima cortará o array mostRecentTitle para que ele tenha os três títulos mais recentes. Faça uma leitura sobre esta coleção para obter o resultado desejado.