mongodb: come ottenere gli ultimi N record?

Non riesco a trovare da nessuna parte è stato documentato questo. Per impostazione predefinita, l’operazione find () otterrà i record dall’inizio. Come posso ottenere gli ultimi N record in mongodb?

Modifica: voglio anche che il risultato restituito sia ordinato da meno recente a più recente, non viceversa.

Se capisco la tua domanda, devi ordinare in ordine crescente.

Supponendo che tu abbia qualche ID o campo di date chiamato “x” che faresti …

.ordinare()


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

Il 1 ordinerà in ordine crescente (dal più vecchio al più recente) e -1 sarà in ordine decrescente (dal più recente al più vecchio).

Se usi il campo _id creato automaticamente ha una data incorporata in esso … quindi puoi usarlo per ordinare da …

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

Ciò restituirà tutti i documenti ordinati dal più vecchio al più recente.

Ordine naturale


Puoi anche utilizzare un ordine naturale menzionato sopra …

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

Di nuovo, usando 1 o -1 a seconda dell’ordine che vuoi.

Usa .limit ()


Infine, è buona norma aggiungere un limite quando si esegue questa sorta di query aperta in modo da poter fare entrambe le cose …

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

o

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

Gli ultimi N record aggiunti, da meno recenti a più recenti, possono essere visualizzati con questa query:

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

Se li vuoi nell’ordine inverso:

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

Se installi Mongo-Hacker puoi anche usare:

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

Se ti stanchi di scrivere questi comandi tutto il tempo puoi creare funzioni personalizzate nel tuo ~ / .mongorc.js. Per esempio

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

quindi da una shell mongo basta digitare last(N)

Per ottenere gli ultimi N record puoi eseguire la query seguente:

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

se vuoi solo un ultimo record:

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

Nota: al posto di $ naturale puoi utilizzare una delle colonne della tua raccolta.

puoi usare sort() , limit() , skip() per ottenere l’ultimo record N dall’inizio da qualsiasi valore saltato

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

Non è ansible “saltare” in base alla dimensione della raccolta, perché non terrà conto delle condizioni della query.

La soluzione corretta è quella di ordinare dal punto finale desiderato, limitare la dimensione del set di risultati, quindi modificare l’ordine dei risultati, se necessario.

Ecco un esempio, basato sul codice del mondo reale.

 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 }); } }); 

Cerca in Querying: Ordinamento e ordine naturale, http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order e sort () in Metodi cursore http://www.mongodb.org/display / DOCS / Advanced + query

Potresti voler utilizzare le opzioni di find : http://docs.meteor.com/api/collections.html#Mongo-Collection-find

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

@ Bin-chen,

È ansible utilizzare un’aggregazione per le ultime n voci di un sottoinsieme di documenti in una raccolta. Ecco un esempio semplificato senza raggruppamento (cosa che si farebbe tra gli stadi 4 e 5 in questo caso).

Restituisce le ultime 20 voci (basate su un campo chiamato “timestamp”), ordinate in ordine crescente. Quindi proietta ogni documento _id, timestamp e qualunque campo_della_variata_della_funzione nei risultati.

 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) } 

quindi, il risultato sarebbe simile a qualcosa:

 { "_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 } 

Spero che questo ti aiuti.

L’ultima funzione dovrebbe essere sort , non limit .

Esempio:

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