mongodb: como obter os últimos registros N?

Não consigo encontrar em qualquer lugar que tenha sido documentado isso. Por padrão, a operação find () obterá os registros do início. Como posso obter os últimos N registros no mongodb?

Edit: também quero o resultado retornado ordenado de menos recente para o mais recente, não o inverso.

Se eu entendi sua pergunta, você precisa classificar em ordem crescente.

Supondo que você tenha algum campo de identificação ou data chamado “x” você faria …

.ordenar()


db.foo.find().sort({x:1}); 

O 1 classificará ascendente (do mais antigo para o mais recente) e -1 será classificado como decrescente (do mais recente para o mais antigo).

Se você usar o campo _id criado automaticamente, ele terá uma data incorporada … para que você possa usá-lo …

 db.foo.find().sort({_id:1}); 

Isso retornará todos os seus documentos classificados do mais antigo para o mais recente.

Ordem natural


Você também pode usar uma ordem natural mencionada acima …

 db.foo.find().sort({$natural:1}); 

Mais uma vez, usando 1 ou -1, dependendo da ordem desejada.

Use .limit ()


Por último, é uma boa prática adicionar um limite ao fazer esse tipo de consulta aberta para que você possa fazer …

 db.foo.find().sort({_id:1}).limit(50); 

ou

 db.foo.find().sort({$natural:1}).limit(50); 

Os últimos N registros adicionados, do menos recente ao mais recente, podem ser vistos com esta consulta:

 db.collection.find().skip(db.collection.count() - N) 

Se você quiser na ordem inversa:

 db.collection.find().sort({ $natural: -1 }).limit(N) 

Se você instalar o Mongo-Hacker, também poderá usar:

 db.collection.find().reverse().limit(N) 

Se você se cansar de escrever esses comandos o tempo todo, você pode criar funções personalizadas em seu ~ / .mongorc.js. Por exemplo

 function last(N) { return db.collection.find().skip(db.collection.count() - N); } 

então de um mongo apenas digite last(N)

Para obter os últimos N registros, você pode executar a consulta abaixo:

 db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber) 

se você quiser apenas um último registro:

 db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}}) 

Nota: No lugar de $ natural, você pode usar uma das colunas da sua coleção.

você pode usar sort() , limit() , skip() para obter o último registro de N a partir de qualquer valor ignorado

 db.collections.find().sort(key:value).limit(int value).skip(some int value); 

Você não pode “pular” com base no tamanho da coleção, porque não levará em conta as condições da consulta.

A solução correta é classificar do ponto final desejado, limitar o tamanho do conjunto de resultados e ajustar a ordem dos resultados, se necessário.

Aqui está um exemplo, baseado em código do mundo real.

 var query = collection.find( { conditions } ).sort({$natural : -1}).limit(N); query.exec(function(err, results) { if (err) { } else if (results.length == 0) { } else { results.reverse(); // put the results into the desired order results.forEach(function(result) { // do something with each result }); } }); 

Procure em Consulta: Ordenação e Ordem Natural, http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order , bem como sort () em Métodos de Cursor http://www.mongodb.org/display / DOCS / Advanced + Queries

Você pode querer usar as opções de pesquisa: http://docs.meteor.com/api/collections.html#Mongo-Collection-find

 db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch(); 

@ bin-chen,

Você pode usar uma agregação para as últimas n inputs de um subconjunto de documentos em uma coleção. Aqui está um exemplo simplificado sem agrupamento (o que você faria entre os estágios 4 e 5 neste caso).

Isso retorna as 20 inputs mais recentes (com base em um campo chamado “timestamp”), classificadas como ascendentes. Em seguida, ele projeta cada documento _id, timestamp e whatever_field_you_want_to_show nos resultados.

 var pipeline = [ { "$match": { //stage 1: filter out a subset "first_field": "needs to have this value", "second_field": "needs to be this" } }, { "$sort": { //stage 2: sort the remainder last-first "timestamp": -1 } }, { "$limit": 20 //stage 3: keep only 20 of the descending order subset }, { "$sort": { "rt": 1 //stage 4: sort back to ascending order } }, { "$project": { //stage 5: add any fields you want to show in your results "_id": 1, "timestamp" : 1, "whatever_field_you_want_to_show": 1 } } ] yourcollection.aggregate(pipeline, function resultCallBack(err, result) { // account for (err) // do something with (result) } 

então, o resultado seria algo como:

 { "_id" : ObjectId("5ac5b878a1deg18asdafb060"), "timestamp" : "2018-04-05T05:47:37.045Z", "whatever_field_you_want_to_show" : -3.46000003814697 } { "_id" : ObjectId("5ac5b878a1de1adsweafb05f"), "timestamp" : "2018-04-05T05:47:38.187Z", "whatever_field_you_want_to_show" : -4.13000011444092 } 

Espero que isto ajude.

Última function deve ser sort , não limit .

Exemplo:

 db.testcollection.find().limit(3).sort({timestamp:-1});