MongoDB Fehler behandeln

MongoDBBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie wesentliche Techniken zur Behandlung gängiger Fehler in MongoDB. Mithilfe der MongoDB Shell (mongosh) üben Sie das Identifizieren und Beheben verschiedener Probleme, einschließlich Verbindungsfehlern, Duplikat-Schlüssel-Fehlern und Datenvalidierungsfehlern. Am Ende dieses Labs werden Sie ein praktisches Verständnis dafür entwickeln, wie Sie Ihre Datenbankoperationen zuverlässiger und robuster gestalten können.

Verbindung zu MongoDB herstellen und Fehler behandeln

Verbindungsfehler sind ein häufiges Problem bei der Arbeit mit jeder Datenbank. Sie können aus verschiedenen Gründen auftreten, z. B. falsche Serveradresse, Netzwerkprobleme oder wenn der Datenbankserver nicht läuft. In diesem Schritt lernen Sie, wie Sie einen Verbindungsfehler identifizieren und dann erfolgreich eine Verbindung herstellen.

Versuchen Sie zunächst, eine Verbindung zu einer MongoDB-Instanz auf einem Port herzustellen, auf dem diese nicht läuft. Der Standardport für MongoDB ist 27017. Wir werden versuchen, eine Verbindung zu Port 27018 herzustellen.

Führen Sie den folgenden Befehl in Ihrem Terminal aus:

mongosh "mongodb://localhost:27018"

Dieser Befehl schlägt fehl und gibt einen Fehler zurück, da die Shell keinen MongoDB-Server unter der angegebenen Adresse finden kann. Die Ausgabe sieht dann ungefähr so aus:

MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27018

Der MongoNetworkError zeigt deutlich einen Verbindungsfehler an. Der Teil ECONNREFUSED teilt Ihnen mit, dass die Zielmaschine die Verbindung aktiv verweigert hat, was normalerweise bedeutet, dass kein Dienst auf diesem Port lauscht.

Lassen Sie uns nun eine Verbindung zum richtigen Port herstellen. Der MongoDB-Dienst wurde während der Einrichtungsphase für Sie gestartet. Um eine Verbindung herzustellen, führen Sie den mongosh-Befehl ohne Argumente aus. Dies verwendet die Standardverbindungszeichenfolge mongodb://127.0.0.1:27017.

mongosh

Nach erfolgreicher Verbindung sehen Sie eine Willkommensnachricht und die Eingabeaufforderung test>, die anzeigt, dass Sie mit der Standarddatenbank test verbunden sind.

Current Mongosh Log ID: ...
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.2.6
Using MongoDB:          8.0.0
Using Mongosh:          2.2.6
...
test>

Sie sind nun mit dem MongoDB-Server verbunden. Bitte lassen Sie dieses Terminal geöffnet und bleiben Sie in der mongosh-Shell für die folgenden Schritte.

Fehler bei doppelten Schlüsseln behandeln

Die Aufrechterhaltung der Datenintegrität ist für jede Anwendung von entscheidender Bedeutung. Eines der häufigsten Probleme bei der Datenintegrität sind doppelte Datensätze. MongoDB verhindert dies durch eindeutige Indizes, die sicherstellen, dass ein indiziertes Feld keine doppelten Werte speichert.

Sie sollten sich aus dem vorherigen Schritt bereits in der mongosh-Shell befinden. Wechseln Sie zunächst zu einer neuen Datenbank namens errorlab. Eine Datenbank wird automatisch erstellt, wenn Sie dort zum ersten Mal Daten speichern.

use errorlab

Erstellen Sie als Nächstes einen eindeutigen Index für das Feld email in einer neuen Sammlung users. Dieser Befehl weist MongoDB an, dass jedes Dokument in der Sammlung users einen eindeutigen Wert für das Feld email haben muss.

db.users.createIndex({ email: 1 }, { unique: true });

Die Ausgabe bestätigt, dass der Index erfolgreich erstellt wurde.

{
  "numIndexesBefore": 1,
  "numIndexesAfter": 2,
  "createdCollectionAutomatically": true,
  "ok": 1
}

Fügen Sie nun ein Dokument in die Sammlung users ein. Diese Operation wird erfolgreich sein, da die Sammlung leer ist und die E-Mail-Adresse eindeutig ist.

db.users.insertOne({ name: "John Doe", email: "john@example.com" });

Sie sehen eine Bestätigungsnachricht mit der ID des eingefügten Dokuments:

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

Versuchen Sie als Nächstes, ein weiteres Dokument mit derselben E-Mail-Adresse einzufügen.

db.users.insertOne({ name: "Jane Doe", email: "john@example.com" });

Dieses Mal schlägt die Operation fehl. MongoDB gibt einen MongoBulkWriteError mit dem spezifischen Fehlercode E11000 zurück, der auf einen Duplikat-Schlüssel-Fehler hinweist. Dies ist das erwartete Verhalten zum Schutz der Datenintegrität.

MongoServerError: E11000 duplicate key error collection: errorlab.users index: email_1 dup key: { email: "john@example.com" }

Doppelte Schlüssel mit Upsert auflösen

Das Verhindern von Duplikaten ist gut, aber manchmal möchten Sie einen Datensatz aktualisieren, wenn er existiert, oder ihn erstellen, wenn er nicht existiert. Diese "Aktualisieren oder Einfügen"-Logik ist eine gängige Anforderung. MongoDB bietet eine saubere Möglichkeit, dies mit der Option upsert zu tun.

Versuchen wir, den Benutzer mit der E-Mail-Adresse john@example.com zu aktualisieren. Wir verwenden die Methode updateOne mit der Option upsert, die auf true gesetzt ist.

db.users.updateOne(
  { email: "john@example.com" },
  { $set: { name: "John Doe Updated", lastUpdated: new Date() } },
  { upsert: true }
);

Die Ausgabe zeigt, dass ein Dokument übereinstimmte und modifiziert wurde. Die upsertedId ist null, da ein vorhandenes Dokument aktualisiert und kein neues eingefügt wurde.

{
  "acknowledged": true,
  "matchedCount": 1,
  "modifiedCount": 1,
  "upsertedId": null
}

Führen wir nun einen ähnlichen Befehl für einen Benutzer aus, der noch nicht existiert, jane@example.com.

db.users.updateOne(
  { email: "jane@example.com" },
  { $set: { name: "Jane Doe", lastUpdated: new Date() } },
  { upsert: true }
);

Dieses Mal zeigt die Ausgabe, dass matchedCount 0 ist, aber ein neues Dokument erstellt wurde, wie durch upsertedId angezeigt.

{
  "acknowledged": true,
  "matchedCount": 0,
  "modifiedCount": 0,
  "upsertedId": ObjectId("...")
}

Um die Ergebnisse zu überprüfen, können Sie die Sammlung abfragen, um alle Dokumente anzuzeigen. Die Methode pretty() formatiert die Ausgabe zur einfacheren Lesbarkeit.

db.users.find().pretty();

Die Ausgabe zeigt beide Dokumente an: Johns Dokument mit dem aktualisierten Namen und Janes neu erstelltes Dokument. Die Option upsert bietet eine leistungsstarke und atomare Möglichkeit, "Erstellen oder Aktualisieren"-Szenarien zu handhaben.

Abfrage- und Validierungsfehler behandeln

Fehler können auch auftreten, wenn Sie Daten abfragen oder wenn eingefügte Daten vordefinierten Regeln nicht entsprechen. In diesem Schritt untersuchen Sie einen Syntaxfehler bei der Abfrage und einen Datenvalidierungsfehler.

Sehen wir uns zunächst an, was passiert, wenn Sie einen nicht vorhandenen Abfrageoperator verwenden. Dies ist ein häufiger Tippfehler.

db.users.find({ name: { $invalidOperator: "John" } });

MongoDB gibt sofort einen Fehler zurück, da es $invalidOperator nicht erkennt.

MongoServerError[BadValue]: unknown operator: $invalidOperator

Als Nächstes untersuchen wir eine leistungsfähigere Funktion: die Schema-Validierung. Sie können Regeln definieren, denen Dokumente folgen müssen, um in eine Sammlung eingefügt oder aktualisiert zu werden. Erstellen wir eine neue Sammlung products mit einem Validator, der einen name (string) und einen price (number) erfordert.

db.createCollection("products", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "price"],
      properties: {
        name: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        price: {
          bsonType: "number",
          description: "must be a number and is required"
        }
      }
    }
  }
});

Versuchen Sie nun, ein Dokument einzufügen, das dieses Schema verletzt, indem Sie den price als String anstelle einer Zahl angeben.

db.products.insertOne({ name: "Laptop", price: "1200" });

Die Operation schlägt mit einem MongoBulkWriteError fehl. Die Meldung Document failed validation gibt klar den Grund an und verhindert, dass fehlerhafte Daten in Ihre Datenbank gelangen.

MongoServerError: Document failed validation
...

Fügen Sie abschließend ein gültiges Dokument ein, das dem Schema entspricht.

db.products.insertOne({ name: "Laptop", price: 1200 });

Diese Operation ist erfolgreich, da das Dokument gültig ist.

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

Die Schema-Validierung ist ein leistungsstarkes Werkzeug zur Durchsetzung der Datenkonsistenz direkt in der Datenbank.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie verschiedene gängige Arten von MongoDB-Fehlern mit der mongosh-Shell behandeln. Sie haben damit begonnen, einen Verbindungsfehler zu identifizieren und zu beheben. Anschließend haben Sie die Datenintegrität durch die Erstellung eines eindeutigen Index zur Vermeidung von Duplikat-Schlüssel-Fehlern durchgesetzt. Sie haben auch gelernt, wie Sie die Option upsert verwenden, um die "Aktualisieren oder Einfügen"-Logik elegant zu handhaben. Schließlich haben Sie Abfrage-Syntaxfehler untersucht und die Schema-Validierung verwendet, um zu verhindern, dass ungültige Daten in Ihrer Datenbank gespeichert werden. Diese grundlegenden Fähigkeiten zur Fehlerbehandlung sind unerlässlich für die Entwicklung zuverlässiger und robuster Anwendungen mit MongoDB.