Einfache MongoDB-Abfragen schreiben

MongoDBBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie grundlegende MongoDB-Abfragetechniken. Sie beginnen mit der Verbindung zu einer Datenbank und dem Einfügen von Daten. Anschließend üben Sie das Abrufen von Dokumenten, das Filtern mit exakten Übereinstimmungen und Vergleichsoperatoren, das Auswählen spezifischer Felder, die zurückgegeben werden sollen, und das Formatieren der Ausgabe durch Sortieren und Begrenzen der Ergebnisse. Am Ende dieses Labs werden Sie eine solide Grundlage für die Abfrage von Daten in einer MongoDB-Datenbank haben.

Mit MongoDB verbinden und alle Dokumente finden

In diesem ersten Schritt verbinden Sie sich mit dem MongoDB-Server, erstellen eine Datenbank und eine Collection, fügen einige Beispieldaten ein und rufen dann alle Dokumente aus dieser Collection ab. Dies ist der Ausgangspunkt für jede Datenbankinteraktion.

Öffnen Sie zunächst Ihr Terminal und starten Sie die MongoDB Shell, indem Sie den Befehl mongosh ausführen.

mongosh

Die Eingabeaufforderung Ihres Terminals ändert sich, um anzuzeigen, dass Sie sich nun in der MongoDB Shell befinden und bereit sind, Datenbankbefehle auszuführen.

Wechseln Sie als Nächstes zu einer neuen Datenbank namens bookstore. Wenn die Datenbank nicht existiert, erstellt MongoDB sie, wenn Sie zum ersten Mal Daten speichern.

use bookstore

Nun fügen wir einige Dokumente in eine neue Collection namens books ein. Eine Collection ist eine Gruppe von MongoDB-Dokumenten, ähnlich einer Tabelle in einer relationalen Datenbank. Die Methode insertMany() ermöglicht es Ihnen, mehrere Dokumente auf einmal hinzuzufügen.

db.books.insertMany([
  { title: "Python Basics", author: "John Smith", year: 2022, stock: 15 },
  { title: "MongoDB Essentials", author: "Jane Doe", year: 2023, stock: 8 },
  { title: "Web Development", author: "Alice Johnson", year: 2021, stock: 20 }
]);

Nach Ausführung des Befehls sehen Sie eine Bestätigung, dass die Dokumente erfolgreich eingefügt wurden.

Um alle Dokumente in der books-Collection abzurufen und anzuzeigen, verwenden Sie die Methode find() ohne Argumente.

db.books.find();

Die Ausgabe listet alle drei Dokumente auf, die Sie gerade eingefügt haben. Jedes Dokument hat ein Feld _id, das ein eindeutiger Bezeichner ist, der automatisch von MongoDB hinzugefügt wird.

[
  {
    _id: ObjectId("..."),
    title: 'Python Basics',
    author: 'John Smith',
    year: 2022,
    stock: 15
  },
  {
    _id: ObjectId("..."),
    title: 'MongoDB Essentials',
    author: 'Jane Doe',
    year: 2023,
    stock: 8
  },
  {
    _id: ObjectId("..."),
    title: 'Web Development',
    author: 'Alice Johnson',
    year: 2021,
    stock: 20
  }
]

Dokumente mit exakten Übereinstimmungen abfragen

Nachdem Sie nun alle Dokumente abrufen können, besteht der nächste Schritt darin, sie zu filtern, um bestimmte zu finden. Dies können Sie tun, indem Sie der Methode find() ein Abfragefilterdokument übergeben. Dies ermöglicht Ihnen, exakte Übereinstimmungen bei Feldwerten durchzuführen.

Suchen wir das Buch mit dem exakten Titel "Python Basics". Der Abfragefilter { title: "Python Basics" } weist MongoDB an, nur die Dokumente zurückzugeben, bei denen das Feld title exakt "Python Basics" ist.

db.books.find({ title: "Python Basics" });

Der Befehl gibt nur das eine Dokument zurück, das den Kriterien entspricht:

[
  {
    _id: ObjectId("..."),
    title: 'Python Basics',
    author: 'John Smith',
    year: 2022,
    stock: 15
  }
]

Sie können auch basierend auf anderen Feldern abfragen, z. B. auf Zahlen. Um beispielsweise alle Bücher zu finden, die im Jahr 2021 veröffentlicht wurden:

db.books.find({ year: 2021 });

Um eine spezifischere Abfrage zu erstellen, können Sie mehrere Felder im Filterdokument angeben. Dies erstellt eine implizite "UND"-Bedingung, was bedeutet, dass alle angegebenen Bedingungen wahr sein müssen, damit ein Dokument zurückgegeben wird. Suchen wir ein Buch, das von "Jane Doe" geschrieben und im Jahr 2023 veröffentlicht wurde.

db.books.find({ author: "Jane Doe", year: 2023 });

Diese Abfrage gibt das Buch "MongoDB Essentials" zurück, da es das einzige ist, das sowohl dem Autor als auch dem Jahr entspricht.

Filtern mit Vergleichsoperatoren

Exakte Übereinstimmungen sind nützlich, aber oft müssen Sie Dokumente basierend auf Vergleichen finden, z. B. alle Bücher, die nach einem bestimmten Jahr veröffentlicht wurden oder einen Lagerbestand über einem bestimmten Niveau haben. MongoDB bietet hierfür eine Reihe von Abfrageoperatoren.

Vergleichsoperatoren werden innerhalb des Abfragedokuments mit einer Syntax wie { field: { $operator: value } } angegeben.

Suchen wir alle Bücher, die nach 2021 veröffentlicht wurden. Wir verwenden den "größer als"-Operator, $gt.

db.books.find({ year: { $gt: 2021 } });

Dies gibt "Python Basics" (2022) und "MongoDB Essentials" (2023) zurück.

Hier sind einige weitere gängige Vergleichsoperatoren:

  • $lt: kleiner als
  • $gte: größer als oder gleich
  • $lte: kleiner als oder gleich
  • $ne: nicht gleich

Um beispielsweise alle Bücher mit einem Lagerbestand von 15 oder weniger zu finden, können Sie den Operator $lte verwenden.

db.books.find({ stock: { $lte: 15 } });

Ein weiterer nützlicher Operator ist $in, der mit einem der in einem Array angegebenen Werte übereinstimmt. Suchen wir alle Bücher, die entweder von "John Smith" oder "Alice Johnson" geschrieben wurden.

db.books.find({ author: { $in: ["John Smith", "Alice Johnson"] } });

Diese Abfrage gibt "Python Basics" und "Web Development" zurück. Sie können Operatoren mit exakten Übereinstimmungen kombinieren, um komplexere Abfragen zu erstellen. Finden Sie beispielsweise Bücher, die 2022 oder später veröffentlicht wurden und einen Lagerbestand von weniger als 20 haben.

db.books.find({ year: { $gte: 2022 }, stock: { $lt: 20 } });

Spezifische Felder für die Rückgabe auswählen (Projektion)

Standardmäßig geben MongoDB-Abfragen alle Felder in übereinstimmenden Dokumenten zurück. Um die Leistung zu verbessern und die Ausgabe übersichtlicher zu gestalten, können Sie angeben, welche Felder zurückgegeben werden sollen. Dies wird als Projektion bezeichnet.

Die Projektion wird durch das zweite Argument der Methode find() gehandhabt. Dieses Argument ist ein Dokument, in dem Sie die einzuschließenden Felder mit einer 1 oder die auszuschließenden Felder mit einer 0 angeben.

Rufen wir alle Bücher ab, geben aber nur ihre Felder title und author zurück. Das erste Argument, {}, ist ein leeres Filterdokument, das allen Dokumenten entspricht.

db.books.find({}, { title: 1, author: 1 });

Sie werden feststellen, dass das Feld _id immer noch in der Ausgabe enthalten ist. Das Feld _id wird standardmäßig immer zurückgegeben. Um es auszuschließen, müssen Sie es explizit auf 0 setzen.

db.books.find({}, { title: 1, author: 1, _id: 0 });

Nun wird die Ausgabe wesentlich übersichtlicher sein und nur die angeforderten Felder enthalten:

[
  { "title": "Python Basics", "author": "John Smith" },
  { "title": "MongoDB Essentials", "author": "Jane Doe" },
  { "title": "Web Development", "author": "Alice Johnson" }
]

Sie können einen Abfragefilter mit einer Projektion kombinieren. Suchen wir beispielsweise nach Büchern, die im Jahr 2023 veröffentlicht wurden, und geben nur ihre Titel zurück.

db.books.find({ year: 2023 }, { title: 1, _id: 0 });

Diese leistungsstarke Funktion ermöglicht es Ihnen, die Abfrageergebnisse genau an die Bedürfnisse Ihrer Anwendung anzupassen und unnötige Datenübertragungen zu reduzieren.

Ergebnisse sortieren, überspringen und begrenzen

Oft müssen Sie die Reihenfolge und Menge der von einer Abfrage zurückgegebenen Ergebnisse steuern. MongoDB bietet Cursor-Methoden, die Sie an eine find()-Abfrage anhängen können, um die Dokumente im Ergebnissatz zu sortieren, zu überspringen und zu begrenzen.

Um die Ergebnisse zu sortieren, verwenden Sie die Methode .sort(). Sie nimmt ein Dokument 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 Jahr absteigend (neueste zuerst).

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

Um die Anzahl der zurückgegebenen Dokumente zu begrenzen, verwenden Sie die Methode .limit(). Um beispielsweise nur die 2 neuesten Bücher zu erhalten:

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

Die Methode .skip() wird verwendet, um eine angegebene Anzahl von Dokumenten vom Anfang des Ergebnissatzes zu überspringen. Dies ist nützlich für die Implementierung von Paginierung. Rufen wir alle Bücher ab, überspringen aber das erste.

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

Sie können diese Methoden miteinander verketten, um leistungsstarke und präzise Abfragen zu erstellen. Um beispielsweise das zweitälteste Buch in der Sammlung zu finden, können Sie nach Jahr aufsteigend sortieren, das erste Ergebnis überspringen und die Ausgabe auf eins begrenzen.

db.books.find().sort({ year: 1 }).skip(1).limit(1);

Dieser Befehl gibt das Buch "Python Basics" zurück, das im Jahr 2022 veröffentlicht wurde.

Um die MongoDB-Shell zu verlassen, geben Sie schließlich exit ein oder drücken Sie Strg+D.

exit;

Zusammenfassung

In diesem Lab haben Sie die Grundlagen des Schreibens einfacher Abfragen in MongoDB gelernt. Sie haben mit der Verbindung zu einer Datenbank über die mongosh-Shell begonnen und Dokumente in eine Collection eingefügt. Anschließend haben Sie das Abrufen von Dokumenten mit find() geübt, Ergebnisse mit exakten Übereinstimmungen und Vergleichsoperatoren wie $gt und $in gefiltert und die Projektion verwendet, um spezifische Felder auszuwählen. Schließlich haben Sie gelernt, wie Sie die Ausgabe formatieren, indem Sie Cursor-Methoden wie .sort(), .limit() und .skip() verketten, um die Reihenfolge und Größe Ihres Ergebnissatzes zu steuern. Diese Fähigkeiten bilden die Grundlage für die Interaktion mit und die Verwaltung von Daten in MongoDB.