675 votes

Comment obtenir les N derniers enregistrements dans mongodb ?

Je ne trouve nulle part 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 N derniers enregistrements dans mongodb ?

Edit : je veux aussi que le résultat retourné soit ordonné du moins récent au plus récent, et non l'inverse.

9 votes

@Haim, s'il vous plaît soyez spécifique pour répondre, quelle partie de la page web résout ma question ?

0 votes

Bonjour @BinChen, j'ai le même problème récemment, est-il résolu ?

944voto

Justin Jenkins Points 10501

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

En supposant que vous ayez un champ d'identification ou de date appelé "x", vous feriez ...

.sort()


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

Le site 1 triera de manière ascendante (du plus ancien au plus récent) et -1 triera par ordre décroissant (du plus récent au plus ancien).

Si vous utilisez l'auto-création _id il a une date incorporée dans le champ ... donc vous pouvez l'utiliser pour commander par ...

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

Cela vous rendra tous vos documents trié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 souhaitez.

Utiliser .limit()


Enfin, il est bon d'ajouter une limite lorsque l'on effectue ce genre de requête ouverte. Vous pouvez donc faire l'un ou l'autre ...

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

ou

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

0 votes

Cette approche ne fonctionne pas lorsque j'utilise skip et limit avec elle : Item.find().sort('date',-1).skip(start).limit(limit).run(cb) ; Il devrait trier les lignes et ensuite sauter les N premières lignes. Mais il saute les N premières lignes et ensuite trie les autres.

14 votes

@MortezaM. Je suis sûr que vous avez mélangé l'ordre de vos requêtes... votre sort() devrait être exécuté en dernier, et non en premier (comme un ORDER BY SQL). .find({}).skip(1).limit(50).sort({"date":-1})

8 votes

Quoi qu'il en soit, l'ordre d'appel des fonctions ne devrait avoir aucun rapport avec le résultat final.

162voto

Marco Dinacci Points 837

La dernière N Les enregistrements ajoutés, du moins récent au plus récent, 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 êtes fatigué d'écrire ces commandes tout le temps, vous pouvez créer des fonctions personnalisées dans votre ~/.mongorc.js. Par exemple

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

puis, à partir d'un shell mongo, tapez simplement last(N)

2 votes

db.collection.find().reverse().limit(1) me donne l'erreur ... has no method reverse

0 votes

@Catfish vous avez raison, je viens de remarquer que reverse() a été ajouté par [Mongo-Hacker ]( tylerbrock.github.com/mongo-hacker ), je vais mettre à jour ma réponse. Merci.

1 votes

Db.getCollection('COLLECTION_NAME').find().skip(db.getCollection('COLLECTION_NAME').count()-N) fonctionne très bien pour moi :)

22voto

Ashwini Points 79

Afin d'obtenir les N derniers enregistrements, vous pouvez exécuter la requête suivante :

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

si vous ne voulez qu'un seul dernier enregistrement :

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

Note : Au lieu de $natural vous pouvez utiliser l'une des colonnes de votre collection.

0 votes

Ceci fonctionne pour moi db.yourcollectionname.findOne({$query:{}, $orderby : {$natural : -1}}). Je pense que la dernière parathèse manque dans la réponse.

1 votes

L'ordre naturel devrait pas Si vous utilisez un ensemble de répliques (et vous devriez le faire), différents nœuds pourraient bien avoir les mêmes documents stockés dans un ordre différent sur le disque.

8voto

pkp Points 126

Vous pouvez utiliser sort() , limit() , skip() pour obtenir le début des N derniers enregistrements à partir de toute valeur sautée

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

7voto

Steve Wilhelm Points 3607

Consultez la rubrique Requêtes : Tri et ordre naturel, http://www.mongodb.org/display/DOCS/Sorting+et+ordre+naturel ainsi que sort() sous Méthodes du curseur http://www.mongodb.org/display/DOCS/Advanced+Queries

1 votes

Merci pour votre réponse, c'est proche, mais je veux récupérer les enregistrements classés du moins récent au plus récent, est-ce possible ?

0 votes

L'ordre naturel devrait pas Si vous utilisez un ensemble de répliques (et vous devriez le faire), différents nœuds pourraient bien avoir les mêmes documents stockés dans un ordre différent sur le disque.

0 votes

Si vous voulez obtenir les enregistrements les plus récents, vous devrez vous appuyer sur un champ de date dans le document.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X