MongoDB Ergebnisse sortieren und limitieren

MongoDBBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie grundlegende MongoDB-Abfragetechniken zum Sortieren, Begrenzen und Filtern von Datenbankergebnissen. Diese Fähigkeiten sind unerlässlich für die effiziente Verwaltung und Abfrage von Daten. Sie werden die MongoDB-Shell (mongosh) verwenden, um diese Operationen auf einer Beispielsammlung von Dokumenten durchzuführen.

Das Lab führt Sie durch das Sortieren von Dokumenten nach einzelnen oder mehreren Feldern, das Steuern der Anzahl der zurückgegebenen Ergebnisse mithilfe von Limits und Offsets sowie das Zählen von Dokumenten, die bestimmten Kriterien entsprechen. Am Ende dieses Labs werden Sie ein solides Verständnis dafür haben, wie Daten aus einer MongoDB-Datenbank organisiert und abgerufen werden.

Dokumente nach einem einzelnen Feld sortieren

In diesem Schritt lernen Sie, wie Sie Dokumente in einer MongoDB-Sammlung sortieren. Sortieren ermöglicht es Ihnen, Abfrageergebnisse in einer bestimmten Reihenfolge zu organisieren, was für die Datenanalyse und -präsentation entscheidend ist. Ihre Umgebung wurde mit einer bookstore-Datenbank vorkonfiguriert, die eine books-Sammlung enthält.

Öffnen Sie zunächst die MongoDB-Shell, um mit der Datenbank zu interagieren. Führen Sie in Ihrem Terminal den folgenden Befehl aus:

mongosh

Sobald Sie sich in der Shell befinden, wechseln Sie zur bookstore-Datenbank.

use bookstore

Um die Dokumente in der books-Sammlung anzuzeigen, können Sie die find()-Methode verwenden.

db.books.find();

Nun sortieren wir diese Dokumente. Um nach einem einzelnen Feld zu sortieren, verketten Sie die .sort()-Methode mit einer find()-Abfrage. Die sort()-Methode nimmt ein Objekt entgegen, das das zu sortierende Feld und die Richtung angibt: 1 für aufsteigend und -1 für absteigend.

Sortieren wir die Bücher nach der Seitenzahl in aufsteigender Reihenfolge (von den wenigsten zu den meisten Seiten).

db.books.find().sort({ pages: 1 });

Sie sehen, dass das Buch mit den wenigsten Seiten, "Python Basics", zuerst aufgeführt wird.

[
  {
    _id: ObjectId('...'),
    title: 'Python Basics',
    pages: 250,
    price: 29.99
  },
  {
    _id: ObjectId('...'),
    title: 'MongoDB Fundamentals',
    pages: 300,
    price: 34.99
  },
  ...
]

Als Nächstes sortieren wir die Bücher nach Preis in absteigender Reihenfolge, um zuerst die teuersten zu finden.

db.books.find().sort({ price: -1 });

Dieser Befehl zeigt "Data Science" ganz oben an, da es den höchsten Preis hat.

[
  {
    _id: ObjectId('...'),
    title: 'Data Science',
    pages: 350,
    price: 44.99
  },
  {
    _id: ObjectId('...'),
    title: 'JavaScript Advanced',
    pages: 400,
    price: 39.99
  },
  ...
]

Nach mehreren Feldern sortieren

Manchmal reicht die Sortierung nach einem einzelnen Feld nicht aus. MongoDB ermöglicht es Ihnen, mehrere Schlüssel für die Sortierung anzugeben, um verfeinerte Reihenfolgen zu erstellen. In diesem Schritt lernen Sie, wie Sie Dokumente basierend auf einer Abfolge von Feldern sortieren.

Fügen wir unserer Sammlung ein paar weitere Bücher hinzu, um die Mehrschlüssel-Sortierung besser zu veranschaulichen. Diese neuen Bücher haben den gleichen Preis wie ein vorhandenes, aber unterschiedliche Seitenzahlen.

db.books.insertMany([
  { title: "Machine Learning", pages: 420, price: 39.99 },
  { title: "Web Development", pages: 380, price: 39.99 }
]);

Nun haben wir drei Bücher zum Preis von 39,99 $. Wenn wir nur nach dem Preis sortieren, ist die Reihenfolge dieser drei Bücher nicht garantiert. Um eine vorhersehbare Reihenfolge zu schaffen, können wir einen zweiten Sortierschlüssel hinzufügen.

Sortieren wir die Bücher zuerst nach price in aufsteigender Reihenfolge und dann nach pages in absteigender Reihenfolge für Bücher mit demselben Preis.

db.books.find().sort({ price: 1, pages: -1 });

Der Abfrageprozessor sortiert zuerst alle Dokumente nach price. Dann sortiert er für Dokumente mit demselben price (wie unsere drei Bücher für 39,99 $) diese nach pages in absteigender Reihenfolge.

Ihre Ausgabe für die Bücher zum Preis von 39,99 $ sollte in dieser Reihenfolge erscheinen:

  1. "Machine Learning" (420 Seiten)
  2. "JavaScript Advanced" (400 Seiten)
  3. "Web Development" (380 Seiten)
[
  ...,
  {
    _id: ObjectId('...'),
    title: 'Machine Learning',
    pages: 420,
    price: 39.99
  },
  {
    _id: ObjectId('...'),
    title: 'JavaScript Advanced',
    pages: 400,
    price: 39.99
  },
  {
    _id: ObjectId('...'),
    title: 'Web Development',
    pages: 380,
    price: 39.99
  },
  ...
]

Diese Technik ist nützlich, um komplexe, stabile Sortierungen für Benutzeroberflächen und Berichte zu erstellen.

Ergebnisse limitieren und überspringen

Bei der Arbeit mit großen Datensätzen müssen Sie oft nur eine Teilmenge der Ergebnisse abrufen. MongoDB bietet zu diesem Zweck die Methoden .limit() und .skip(). Zusammen bilden sie die Grundlage für die Implementierung von Paginierung (Seitennummerierung).

Die Methode .limit() beschränkt die Anzahl der von einer Abfrage zurückgegebenen Dokumente. Holen wir uns nur die 3 teuersten Bücher.

db.books.find().sort({ price: -1 }).limit(3);

Dieser Befehl sortiert zuerst alle Bücher nach dem Preis in absteigender Reihenfolge und gibt dann nur die ersten drei Dokumente aus der sortierten Liste zurück.

Die Methode .skip() weist den Cursor an, eine angegebene Anzahl von Dokumenten am Anfang des Ergebnissatzes zu ignorieren. Dies ist nützlich für die Navigation durch Daten-Seiten.

Um beispielsweise die zweite Seite von Ergebnissen zu erhalten, wobei jede Seite 2 Bücher enthält, würden Sie die ersten 2 Bücher überspringen und das Ergebnis auf 2 begrenzen. Wenden wir dies auf unsere nach Preis sortierte Liste an, um die 3. und 4. teuersten Bücher zu erhalten.

db.books.find().sort({ price: -1 }).skip(2).limit(2);

Diese Abfrage führt die folgenden Aktionen in dieser Reihenfolge aus:

  1. sort({ price: -1 }): Sortiert alle Bücher vom teuersten zum günstigsten.
  2. skip(2): Überspringt die 2 teuersten Bücher.
  3. limit(2): Gibt die nächsten 2 Bücher aus der Liste zurück.

Die Ausgabe zeigt die dritten und vierten Bücher in der sortierten Liste.

[
  {
    _id: ObjectId('...'),
    title: 'JavaScript Advanced',
    pages: 400,
    price: 39.99
  },
  {
    _id: ObjectId('...'),
    title: 'Web Development',
    pages: 380,
    price: 39.99
  }
]

Durch Anpassung der Werte in skip() und limit() können Sie ein vollständiges Paginierungssystem implementieren.

Dokumente zählen

Eine weitere häufige Anforderung ist das Zählen der Dokumente in einer Collection, entweder insgesamt oder solche, die einem bestimmten Filter entsprechen. MongoDB bietet hierfür die Methode countDocuments().

Um die Gesamtzahl der Bücher in unserer Collection zu ermitteln, führen Sie den folgenden Befehl aus:

db.books.countDocuments();

Dies gibt die Gesamtzahl der Dokumente zurück, die nach den Ergänzungen aus Schritt 2 6 betragen sollte.

Leistungsfähiger ist, dass countDocuments() einen Abfragefilter akzeptieren kann, um nur die Dokumente zu zählen, die bestimmten Kriterien entsprechen. Zählen wir, wie viele Bücher mehr als 35 $ kosten. Hierfür verwenden wir den Abfrageoperator $gt (größer als).

db.books.countDocuments({ price: { $gt: 35 } });

Dies gibt die Anzahl der Bücher zurück, deren Preis größer als 35 ist.

Sie können auch mehrere Bedingungen in Ihrem Filter verwenden. Zählen wir die Bücher, die genau 39,99 $ kosten und 400 oder mehr Seiten haben. Hier verwenden wir den Operator $gte (größer als oder gleich).

db.books.countDocuments({ price: 39.99, pages: { $gte: 400 } });

Dieser Befehl gibt 2 zurück, was "Machine Learning" (420 Seiten) und "JavaScript Advanced" (400 Seiten) entspricht. Die Verwendung von countDocuments() mit Filtern ist eine effiziente Methode, um Statistiken über Ihre Daten zu erhalten, ohne die Dokumente selbst abrufen zu müssen.

Um die MongoDB-Shell zu beenden, können Sie exit eingeben oder Strg+D drücken.

exit;

Zusammenfassung

In diesem Lab haben Sie mehrere wesentliche MongoDB-Abfragetechniken gelernt. Sie haben damit begonnen, Dokumente mit der Methode .sort() nach einem einzelnen Feld sowohl in aufsteigender als auch in absteigender Reihenfolge zu sortieren. Anschließend haben Sie sich mit der Mehrschlüssel-Sortierung beschäftigt, die eine komplexere und stabilere Reihenfolge der Ergebnisse ermöglicht.

Als Nächstes haben Sie untersucht, wie Sie die Größe Ihres Ergebnissatzes mit .limit() zur Beschränkung der zurückgegebenen Dokumente und mit .skip() zur Implementierung von Paginierung steuern können. Schließlich haben Sie gelernt, wie Sie countDocuments() verwenden, um Dokumente effizient zu zählen, sowohl in einer gesamten Collection als auch solche, die bestimmten Filterkriterien entsprechen. Diese Befehle sind grundlegende Werkzeuge für jeden Entwickler, der mit MongoDB arbeitet.