web-dev-qa-db-fra.com

Obtenez le dernier disque de la collection mongodb

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

Remarque: 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 est que plus longtemps la collecte est le temps de récupérer les données et ma collection "test" est vraiment énorme. J'ai besoin d'une requête à temps de réponse constant.

S'il y a une meilleure requête en ligne de commande mongodb, faites le moi savoir.

68
inkriti

Ceci est une révision de la réponse précédente mais il est plus probable que cela fonctionne sur différentes versions de mongodb.

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

Cela vous donnera un dernier document pour une collection

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

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

Edit : Pour tous les votants descendants, la syntaxe Mongoose ci-dessus, la syntaxe Mongo CLI est: db.collectionName.find({}).sort({$natural:-1}).limit(1)

24
dark_ruby

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

Par défaut, les index dans MongoDB sont des arbres B-Trees. La recherche d'un arbre B est une opération O(logN), de sorte que même find({_id:...}) ne fournira pas une réponse à 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 que jusqu’à la dernière seconde.

Vous pouvez avoir recours à "écrire deux fois". Ecrivez une fois dans la collection principale et réécrivez dans une collection "mise à jour en dernier". Sans transactions, cela ne sera pas parfait, mais avec un seul élément dans la collection "dernière mise à jour", il sera toujours rapide.

19
Gates VP

Encore une autre façon d’obtenir le dernier élément d’une collection MongoDB (ne vous inquiétez pas des 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 par ordre décroissant de tous les documents, en fonction de leur _ids.

Projection triée (_id: ordre inverse) - obtenir le premier (dernier) document

> 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." }
3
ivanleoncz

Si vous utilisez des ID d'objet Mongo générés automatiquement dans votre document, celui-ci contient l'horodatage sous la forme de 4 premiers octets, à l'aide duquel le dernier document inséré dans la collection peut être trouvé. Je comprends que c’est une vieille question, mais si quelqu'un finit toujours ici par chercher une autre alternative.

db.collectionName.aggregate(
[{$group: {_id: null, latestDocId: { $max: "$_id"}}}, {$project: {_id: 0, latestDocId: 1}}])

La requête ci-dessus donnerait le _id pour le dernier document inséré dans la collection

0
Chan15