mongodb: comment obtenir le dernier n records?
Je ne trouve nulle part où cela a été documenté. Par défaut, l'opération find () récupérera les enregistrements dès le début. Comment puis-je obtenir les N derniers disques en mongodb?
Edit: aussi je veux le résultat retourné commandé de moins récente à la plus récente, pas l'inverse.
9 réponses
si je comprends votre question, vous devez trier dans l'ordre croissant.
si vous avez une identification ou un champ de date appelé" x", vous le feriez ...
.sort ()
db.foo.find().sort({x:1});
le 1 triera ascendant (du plus ancien au plus récent) et -1 triera descendant (du plus récent au plus ancien.)
Si vous utilisez l'auto créé _id le terrain, il a une date qui y est incorporé ... donc tu peux utiliser ça pour commander ...
db.foo.find().sort({_id:1});
qui vous ramènera tous vos documents triés des plus anciens aux plus récents.
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 dépend de l'ordre que vous voulez.
utiliser .limite ()
enfin, c'est une bonne pratique d'ajouter une limite en faisant ce genre de requête ouverte afin que vous puissiez faire l'un ou l'autre ...
db.foo.find().sort({_id:1}).limit(50);
ou
db.foo.find().sort({$natural:1}).limit(50);
Le dernier N , a ajouté des enregistrements, du moins récent au plus récent, peut être vu avec cette requête:
db.collection.find().skip(db.collection.count() - N)
Si vous 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 d'un Mongo shell juste type last(N)
pour obtenir n derniers enregistrements, Vous pouvez exécuter ci-dessous la requête:
db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber)
si vous voulez seulement un dernier enregistrement:
db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}})
Note: au lieu de $natural Vous pouvez utiliser une des colonnes de votre collection.
vous pouvez utiliser sort()
, limit()
, skip()
pour obtenir le dernier enregistrement n démarrer à partir de n'importe quelle valeur sautée
db.collections.find().sort(key:value).limit(int value).skip(some int value);
vous ne pouvez pas" sauter " basé sur la taille de la collection, parce qu'il ne tiendra pas compte des conditions de requête.
la bonne solution est de trier à partir du point final désiré, limiter la taille de l'ensemble 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 l'Interrogation: le Tri et l'Ordre Naturel, http://www.mongodb.org/display/DOCS/Sorting+et+Naturel+Commande ainsi que sort () sous les méthodes curseur http://www.mongodb.org/display/DOCS/Advanced + Queries
vous pouvez utiliser les options 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 dernières entrées n d'un sous-ensemble de documents dans une collection. Voici un exemple simplifié sans regroupement (ce que vous feriez entre les étapes 4 et 5 dans ce cas).
renvoie les 20 dernières entrées (basées sur un champ appelé" timestamp"), triées ascendantes. Il projette ensuite chacun des documents _id, timestamp et whatever_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
}
Espérons que cette aide.
dernière fonction doit être sort
, pas limit
.
exemple:
db.testcollection.find().limit(3).sort({timestamp:-1});