128 votes

Obtenez les derniers enregistrements de la collection mongodb.

Je veux connaître l'enregistrement le plus récent dans une collection. Comment faire ?

Note : Je sais que les requêtes en ligne de commande suivantes fonctionnent :

1. db.test.find().sort({"idate":-1}).limit(1).forEach(printjson);
2. db.test.find().skip(db.test.count()-1).forEach(printjson)

où idate a l'horodatage ajouté.

Le problème, c'est qu'il faut plus de temps pour récupérer les données et que ma collection "test" est vraiment énorme. J'ai besoin d'une requête avec un temps de réponse constant.

S'il existe une meilleure requête en ligne de commande pour mongodb, faites-le moi savoir.

172voto

Digits Points 2494

Il s'agit d'une répétition de la réponse précédente, mais elle est plus susceptible de fonctionner sur différentes versions de mongodb.

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

17 votes

db.collection.find().limit(1).sort({$natural:-1}).pretty() si vous voulez qu'il soit beau

0 votes

Alors, quelle est la différence avec cet ordre : db.collection.find().sort({$natural:-1}).limit(1).pretty()

0 votes

@Digits quel sera l'impact sur les performances si nous plaçons la limite à la fin et aussi comment le dernier enregistrement est récupéré lorsque vous limitez la sortie à un seul document et il doit être le premier document de la collection.

49voto

dark_ruby Points 1328

Cela vous donnera un dernier document pour un collection

db.collectionName.findOne({}, {sort:{$natural:-1}})

$natural:-1 signifie l'ordre opposé à celui dans lequel les enregistrements sont insérés.

Editar : Pour tous ceux qui ont voté contre, il s'agit d'une syntaxe Mongoose, la syntaxe CLI de Mongoose est : db.collectionName.find({}).sort({$natural:-1}).limit(1)

7 votes

Votre syntaxe semble être mauvaise. Je n'arrive pas à la faire fonctionner comme vous le faites. Ce qui fonctionne, c'est : 'db.punchdeck.findOne( {$query:{}, $orderby:{$natural:-1}} )'.

1 votes

Je ne sais pas pourquoi tous les downvotes - ce code fonctionne parfaitement pour moi, et est rapide

3 votes

@dark_ruby You query returns error "$err" : "Can't canonicalize query : BadValue Unsupported projection option : sort : { $natural : -1.0 }",

20voto

ivanleoncz Points 1940

Encore une autre façon d'obtenir le dernier élément d'une collection MongoDB (ne faites pas attention aux exemples) :

> db.collection.find().sort({'_id':-1}).limit(1)

Projection normale

> db.Sports.find()
{ "_id" : ObjectId("5bfb5f82dea65504b456ab12"), "Type" : "NFL", "Head" : "Patriots Won SuperBowl 2017", "Body" : "Again, the Pats won the Super Bowl." }
{ "_id" : ObjectId("5bfb6011dea65504b456ab13"), "Type" : "World Cup 2018", "Head" : "Brazil Qualified for Round of 16", "Body" : "The Brazilians are happy today, due to the qualification of the Brazilian Team for the Round of 16 for the World Cup 2018." }
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }

Projection triée ( _id : ordre inverse )

> db.Sports.find().sort({'_id':-1})
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }
{ "_id" : ObjectId("5bfb6011dea65504b456ab13"), "Type" : "World Cup 2018", "Head" : "Brazil Qualified for Round of 16", "Body" : "The Brazilians are happy today, due to the qualification of the Brazilian Team for the Round of 16 for the World Cup 2018." }
{ "_id" : ObjectId("5bfb5f82dea65504b456ab12"), "Type" : "NFL", "Head" : "Patriots Won SuperBowl 2018", "Body" : "Again, the Pats won the Super Bowl" }

sort({'_id':-1}) définit une projection dans l'ordre décroissant de tous les documents, sur la base de leur _id s.

Projection triée ( _id : ordre inverse ) : obtenir le dernier document d'une collection.

> db.Sports.find().sort({'_id':-1}).limit(1)
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }

19voto

Gates VP Points 26481

J'ai besoin d'une requête avec un temps de réponse constant

Par défaut, les index de MongoDB sont des B-Trees. La recherche d'un B-Tree est une opération O(logN), donc même find({_id:...}) ne fournira pas de réponses en temps constant, O(1).

Cela dit, vous pouvez également trier par le _id si vous utilisez ObjectId pour vos identifiants. Voir ici pour plus de détails . Bien sûr, même cela n'est bon qu'à la dernière seconde.

Vous pouvez avoir recours à la technique de la "double écriture". Ecrivez une fois dans la collection principale et une autre fois dans une collection "dernière mise à jour". Sans transactions, ce ne sera pas parfait, mais avec un seul élément dans la collection "dernière mise à jour", ce sera toujours rapide.

2voto

Abdul Alim Shakir Points 383

Ma solution :

db.collection("name of collection").find({}, {limit: 1}).sort({$natural: -1})

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