mongodb: comment obtenir les N derniers enregistrements?

Je n’arrive pas à trouver où cela a été documenté. Par défaut, l’opération find () récupère les enregistrements depuis le début. Comment puis-je obtenir les derniers N enregistrements dans mongodb?

Edit: aussi je veux le résultat retourné ordonné de moins récent à plus récent, pas l’inverse.

Si je comprends votre question, vous devez sortinger par ordre croissant.

En supposant que vous avez un champ id ou date appelé “x” vous feriez …

.Trier()


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

Le 1 sortingera par ordre croissant (du plus ancien au plus récent) et -1 sortingera par ordre décroissant (du plus récent au plus ancien).

Si vous utilisez le champ _id créé automatiquement, il contient une date intégrée … vous pouvez donc l’utiliser pour commander par …

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

Cela vous permettra de récupérer tous vos documents sortingés du plus ancien au plus récent.

Ordre Naturel


Vous pouvez également utiliser un ordre naturel mentionné ci-dessus …

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

Encore une fois, en utilisant 1 ou -1 selon l’ordre que vous voulez.

Utilisez .limit ()


Enfin, il est conseillé d’append une limite lorsque vous effectuez ce type de requête largement ouverte afin de pouvoir faire soit

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

ou

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

Les derniers N enregistrements ajoutés, de moins récents à plus récents, peuvent être vus avec cette requête:

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

Si vous les voulez dans l’ordre inverse:

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

Si vous installez Mongo-Hacker, vous pouvez également utiliser:

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

Si vous en avez assez d’écrire ces commandes tout le temps, vous pouvez créer des fonctions personnalisées dans votre fichier ~ / .mongorc.js. Par exemple

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

puis à partir d’une coquille mongo, tapez seulement la last(N)

Pour obtenir les N derniers enregistrements, vous pouvez exécuter la requête ci-dessous:

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

si vous ne voulez qu’un dernier enregistrement:

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

Remarque: à la place de $ natural, vous pouvez utiliser l’une des colonnes de votre collection.

vous pouvez utiliser sort() , limit() , skip() pour obtenir le dernier N enregistrement à partir de toute valeur ignorée

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

Vous ne pouvez pas “sauter” en fonction de la taille de la collection, car cela ne tiendra pas compte des conditions de la requête.

La solution correcte consiste à sortinger le point final souhaité, à limiter la taille du jeu de résultats, puis à ajuster l’ordre des résultats si nécessaire.

Voici un exemple, basé sur le code du monde réel.

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

Regardez sous Querying: Sorting and Natural Order, http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order ainsi que sort () sous Cursor Methods http://www.mongodb.org/display / DOCS / Advanced + Requêtes

Vous voudrez peut-être utiliser les options de find : http://docs.meteor.com/api/collections.html#Mongo-Collection-find

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

@ bin-chen,

Vous pouvez utiliser une agrégation pour les n dernières entrées d’un sous-ensemble de documents dans une collection. Voici un exemple simplifié sans regroupement (que vous feriez entre les étapes 4 et 5 dans ce cas).

Cela retourne les 20 dernières entrées (basées sur un champ appelé “timestamp”), sortingées par ordre croissant. Il projette ensuite chaque document _id, horodatage et what_field_you_want_to_show dans les résultats.

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

donc, le résultat ressemblerait à quelque chose comme:

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

J’espère que cela t’aides.

La dernière fonction devrait être le sort , pas la limit .

Exemple:

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