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.

394
demandé sur Ripon Al Wasim 2010-12-12 13:26:33

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);
554
répondu Justin Jenkins 2010-12-13 01:23:54

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)

87
répondu Trasplazio Garzuglio 2014-12-19 03:40:10

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.

11
répondu Ashwini 2015-08-18 16:57:12

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);
5
répondu pkp 2013-12-18 09:35:38

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
        });
    }
});
5
répondu Marty Hirsch 2014-10-13 18:21:07

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

4
répondu Steve Wilhelm 2010-12-12 10:35:42

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();
2
répondu Lucbug 2017-12-05 22:38:28

@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.

1
répondu lauri108 2018-04-05 06:48:34

dernière fonction doit être sort , pas limit .

exemple:

db.testcollection.find().limit(3).sort({timestamp:-1}); 
-5
répondu Ramesh Kasi 2017-07-19 14:04:11