it-swarm.com.de

Wie bekomme ich die letzten N Datensätze in Mongodb?

Ich kann nirgendwo finden, dass dies dokumentiert wurde. Standardmäßig holt die find () -Operation die Datensätze von Anfang an. Wie bekomme ich die letzten N Datensätze in Mongodb?

Bearbeiten: Ich möchte auch, dass das zurückgegebene Ergebnis von weniger aktuell bis zuletzt sortiert wird, nicht umgekehrt.

425
Bin Chen

Wenn ich Ihre Frage verstehe, müssen Sie aufsteigend sortieren.

Angenommen, Sie haben ein ID- oder Datumsfeld namens "x", das Sie tun würden ...

.Sortieren()


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

1 wird aufsteigend (älteste bis neueste) und -1 wird absteigend (neueste bis älteste) sortiert.

Wenn Sie das automatisch erstellte _id -Feld verwenden, ist ein Datum darin eingebettet ... Sie können dieses dann verwenden, um nach ...

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

Dadurch werden alle Ihre Dokumente zurückgegeben, die vom ältesten zum neuesten sortiert sind.

Natürliche Reihenfolge


Sie können auch eine natürliche Reihenfolge oben erwähnte verwenden ...

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

Verwenden Sie erneut 1 oder -1, je nach der gewünschten Reihenfolge.

Verwenden Sie .limit ()


Schließlich ist es empfehlenswert, bei dieser weit offenen Abfrage ein Limit hinzuzufügen, so dass Sie entweder ...

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

oder

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

Die letzten N hinzugefügten Datensätze, von den jüngsten bis zu den letzten, sind mit dieser Abfrage zu sehen:

db.collection.find().skip(db.collection.count() - N)

Wenn Sie sie in umgekehrter Reihenfolge wünschen:

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

Wenn Sie Mongo-Hacker installieren, können Sie auch Folgendes verwenden:

db.collection.find().reverse().limit(N)

Wenn Sie es satt haben, diese Befehle ständig zu schreiben, können Sie in Ihrem ~/.mongorc.js benutzerdefinierte Funktionen erstellen. Z.B.

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

dann von einer Mongo-Shell einfach last(N)

95

Um die letzten N Datensätze zu erhalten, können Sie folgende Abfrage ausführen:

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

wenn Sie nur einen letzten Datensatz wünschen:

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

Hinweis: Anstelle von $ natural können Sie eine der Spalten Ihrer Sammlung verwenden.

13
Ashwini

sie können sort(), limit(), skip() verwenden, um den letzten Start des N-Datensatzes von einem übersprungenen Wert zu erhalten 

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

Siehe unter Abfragen: Sortieren und natürliche Reihenfolge, http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order Sowie sort () unter Cursor Methods http://www.mongodb.org/display/DOCS/Advanced+Queries

5
Steve Wilhelm

Sie können nicht abhängig von der Größe der Sammlung "überspringen", da die Abfragebedingungen nicht berücksichtigt werden.

Die richtige Lösung ist, nach dem gewünschten Endpunkt zu sortieren, die Ergebnisgröße zu begrenzen und gegebenenfalls die Reihenfolge der Ergebnisse anzupassen. 

Hier ist ein Beispiel, das auf Code aus der realen Welt basiert.

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
Marty Hirsch

@ bin-chen,

Sie können eine Aggregation für die letzten n Einträge einer Untermenge von Dokumenten in einer Sammlung verwenden. Hier ist ein vereinfachtes Beispiel ohne Gruppierung (was Sie in diesem Fall zwischen den Stufen 4 und 5 tun würden).

Dies gibt die letzten 20 Einträge zurück (basierend auf einem Feld mit dem Namen "Zeitstempel"), aufsteigend sortiert. Es projiziert dann jedes Dokument _id, Zeitmarke und whatever_field_you_want_to_show in die Ergebnisse.

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)
}

das Ergebnis würde also ungefähr so ​​aussehen:

{ 
    "_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
}

Hoffe das hilft.

2
lauri108

Möglicherweise möchten Sie die find-Optionen verwenden: http://docs.meteor.com/api/collections.html#Mongo-Collection-find

db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch();
2
Lucbug

Sie können diese Methode ausprobieren:

Holen Sie sich die Gesamtzahl der Datensätze in der Sammlung mit 

db.dbcollection.count() 

Dann überspringen:

db.dbcollection.find().skip(db.dbcollection.count() - 1).pretty()
1
bello hargbola

verwenden Sie den Operator $ slice , um Array-Elemente zu begrenzen 

GeoLocation.find({},{name: 1, geolocation:{$slice: -5}})
    .then((result) => {
      res.json(result);
    })
    .catch((err) => {
      res.status(500).json({ success: false, msg: `Something went wrong. ${err}` });
});

wo Geolocation ein Array von Daten ist, erhalten wir die letzten 5 Datensätze. 

0
KARTHIKEYAN.A

Das Sortieren, Überspringen usw. kann abhängig von der Größe Ihrer Sammlung sehr langsam sein.

Eine bessere Leistung würde erreicht, wenn Sie Ihre Sammlung nach bestimmten Kriterien indexiert haben. und dann könnten Sie min () Cursor verwenden:

Indem Sie Ihre Sammlung mit db.collectionName.setIndex( yourIndex ) indexieren. Sie können die aufsteigende oder absteigende Reihenfolge verwenden, was cool ist, weil Sie immer die "N letzten Elemente" wünschen. Wenn Sie also in absteigender Reihenfolge indexieren, ist dies dasselbe wie das Abrufen der erste N Artikel ".

Dann finden Sie das erste Element Ihrer Sammlung und verwenden dessen Indexfeldwerte als Mindestkriterien in einer Suche wie:

db.collectionName.find().min(minCriteria).hint(yourIndex).limit(N)

Hier ist die Referenz für den Cursor min (): https://docs.mongodb.com/manual/reference/method/cursor.min/

0
João Otero
db.collection.find().hint( { $natural : -1 } ).sort(field: 1/-1).limit(n)

laut mongoDB-Dokumentation :

Sie können {$ natural: 1} angeben, um zu erzwingen, dass die Abfrage einen Forward-Collection-Scan durchführt.

Sie können auch {$ natural: -1} angeben, um zu erzwingen, dass die Abfrage einen Reverse-Collection-Scan durchführt.

0
Gili.il