MongoDB Bestellschema entwerfen

MongoDBBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie Sie ein MongoDB-Schema für eine E-Commerce-Anwendung entwerfen. Ziel ist es, für jede Bestellung ein einziges, umfassendes Dokument zu erstellen, das einfach zu verwalten und abzufragen ist. Sie beginnen mit der Erstellung einer grundlegenden Bestellstruktur und reichern diese dann schrittweise an, indem Sie detaillierte Kundeninformationen, eine Liste der bestellten Artikel, Zahlungsdetails und eine Status-Historie einbetten. Dieser Ansatz demonstriert die Leistungsfähigkeit des Dokumentenmodells von MongoDB für reale Anwendungen.

Erstellen eines grundlegenden Bestelldokuments

In diesem ersten Schritt verbinden Sie sich mit MongoDB und erstellen eine neue Datenbank. Anschließend fügen Sie Ihr erstes Bestell-Dokument ein, das als Grundlage für das Schema dient, das wir in den folgenden Schritten aufbauen werden.

Öffnen Sie zuerst die MongoDB Shell. Diese interaktive Kommandozeilenschnittstelle ermöglicht es Ihnen, mit Ihrer MongoDB-Datenbank zu kommunizieren.

mongosh

Sobald Sie sich in der Shell befinden, sehen Sie eine > Eingabeaufforderung. Wechseln Sie nun zu einer neuen Datenbank namens ecommerce. Wenn die Datenbank nicht existiert, erstellt MongoDB sie für Sie, sobald Sie zum ersten Mal Daten speichern.

use ecommerce

Als Nächstes erstellen Sie eine Collection namens orders, indem Sie ein Dokument darin einfügen. Dieses Dokument repräsentiert eine einzelne Bestellung und enthält wesentliche Informationen wie eine Bestell-ID, Kundendetails, das Bestelldatum und den aktuellen Status.

Führen Sie den folgenden Befehl aus, um das Dokument einzufügen:

db.orders.insertOne({
  order_id: "ORD001",
  order_date: new Date("2023-10-26T10:00:00Z"),
  customer_id: "CUST123",
  status: "pending",
  total: 150.0
});

Dieser Befehl führt folgende Aktionen aus:

  • db.orders: Gibt die orders-Collection innerhalb der aktuellen Datenbank an.
  • insertOne(): Eine MongoDB-Methode zum Einfügen eines einzelnen Dokuments.
  • Das Dokument selbst ist ein JSON-ähnliches Objekt mit Schlüssel-Wert-Paaren für order_id, order_date, customer_id, status und total.

Nach erfolgreichem Einfügen gibt MongoDB eine Bestätigung zusammen mit der eindeutigen _id des neu erstellten Dokuments zurück.

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

Sie haben nun die grundlegende Struktur für eine Bestellung erstellt. Im nächsten Schritt werden Sie dieses Dokument mit detaillierteren Informationen erweitern.

Erweiterung mit eingebetteten Kundendetails

Eine einfache customer_id reicht oft nicht aus. In einer realen Anwendung benötigen Sie beim Abrufen einer Bestellung häufig den Namen und die Adresse des Kunden. Anstatt eine separate Abfrage an eine customers-Collection durchzuführen, können wir diese Informationen direkt in das Bestell-Dokument einbetten. Dies ist ein gängiges und leistungsstarkes Muster in MongoDB, das die Leseleistung verbessert.

In diesem Schritt aktualisieren Sie das Bestell-Dokument, um detaillierte, verschachtelte Kundeninformationen einzufügen. Wenn Sie die mongosh-Shell im vorherigen Schritt beendet haben, starten Sie sie bitte erneut und führen Sie use ecommerce aus.

Verwenden Sie die Methode updateOne(), um das Dokument mit order_id: "ORD001" zu finden und zu ändern. Der Operator $set ersetzt den Wert eines Feldes durch den angegebenen Wert, und $unset entfernt ein Feld vollständig.

db.orders.updateOne(
  { order_id: "ORD001" },
  {
    $set: {
      customer: {
        customer_id: "CUST123",
        first_name: "John",
        last_name: "Doe",
        email: "john.doe@example.com",
        shipping_address: {
          street: "123 Main St",
          city: "Anytown",
          state: "CA",
          zip_code: "12345"
        }
      }
    },
    $unset: {
      customer_id: ""
    }
  }
);

In diesem Befehl:

  • Das erste Argument { order_id: "ORD001" } ist der Filter zur Auswahl des zu aktualisierenden Dokuments.
  • Das zweite Argument enthält die Update-Operatoren:
    • $set: Wir setzen ein neues Feld customer, das ein eingebettetes Dokument mit detaillierten Informationen ist.
    • $unset: Wir entfernen das alte customer_id-Feld auf oberster Ebene, um Datenredundanz zu vermeiden.

Um Ihre Änderungen zu überprüfen, können Sie das aktualisierte Dokument mit findOne() abrufen:

db.orders.findOne({ order_id: "ORD001" });

Die Ausgabe zeigt nun das verschachtelte customer-Dokument an, und das customer_id-Feld auf oberster Ebene ist verschwunden. Diese eingebettete Struktur hält zusammengehörige Daten in einem einzigen Dokument zusammen.

Hinzufügen eines Arrays von Bestellpositionen

Eine Bestellung besteht typischerweise aus einem oder mehreren Produkten. Der beste Weg, diese Eins-zu-Viele-Beziehung innerhalb eines einzelnen Bestell-Dokuments zu modellieren, ist die Verwendung eines Arrays von eingebetteten Dokumenten. Jedes Element im Array repräsentiert eine Position in der Bestellung.

Aktualisieren wir unser Bestell-Dokument, um eine Liste von Positionen hinzuzufügen. Wir fügen ein Feld items hinzu, das ein Array sein wird. Jedes Objekt im Array enthält Details zu einem Produkt, wie z. B. seine ID, seinen Namen, seinen Preis und seine Menge.

Führen Sie den folgenden updateOne-Befehl aus:

db.orders.updateOne(
  { order_id: "ORD001" },
  {
    $set: {
      items: [
        {
          product_id: "PROD01",
          name: "Laptop",
          price: 1200.0,
          quantity: 1
        },
        {
          product_id: "PROD02",
          name: "Mouse",
          price: 25.0,
          quantity: 1
        }
      ],
      total: 1225.0
    }
  }
);

Hier verwenden wir erneut $set, um das items-Array hinzuzufügen. Wir aktualisieren auch das Feld total, um die Summe der Artikelpreise widerzuspiegeln. Die Speicherung des berechneten Gesamtbetrags direkt im Dokument ist eine weitere Leistungsoptimierung, da sie die Notwendigkeit einer Aggregation bei jedem Lesevorgang vermeidet.

Überprüfen wir das Dokument erneut, um das neue items-Array zu sehen.

db.orders.findOne({ order_id: "ORD001" });

Sie sehen das items-Array, das in das Bestell-Dokument eingebettet ist. Dieses Design ermöglicht es Ihnen, eine vollständige Bestellung, einschließlich aller ihrer Positionen, mit einer einzigen Datenbankabfrage abzurufen.

Einbetten von Zahlungsinformationen

Zahlungsdetails sind ein weiterer wichtiger Bestandteil einer Bestellung. Ähnlich wie bei Kundeninformationen und Artikeln können Zahlungsdaten direkt in das Bestell-Dokument eingebettet werden. Dazu gehören die Zahlungsmethode, die Transaktions-ID und der Status.

In diesem Schritt fügen Sie der Bestellung ein payment-Unterdokument hinzu.

db.orders.updateOne(
  { order_id: "ORD001" },
  {
    $set: {
      payment: {
        method: "credit_card",
        transaction_id: "TXN54321",
        status: "completed"
      }
    }
  }
);

Dieser Befehl fügt ein payment-Objekt mit drei Feldern hinzu: method, transaction_id und status. Durch das Einbetten dieser Informationen wird sichergestellt, dass alle Daten, die sich auf eine einzelne Transaktion beziehen, an einem Ort gespeichert sind.

Betrachten wir nun die Struktur unseres Bestell-Dokuments.

db.orders.findOne({ order_id: "ORD001" });

Das Dokument enthält nun umfassende Informationen über die Bestellung, den Kunden, die Artikel und die Zahlung, die alle über einen einzigen Lesevorgang zugänglich sind.

Nachverfolgung des Bestellstatusverlaufs

Eine Bestellung durchläuft verschiedene Phasen, wie z. B. "ausstehend" (pending), "in Bearbeitung" (processing), "versendet" (shipped) und "zugestellt" (delivered). Während das status-Feld auf oberster Ebene den aktuellen Zustand anzeigt, ist es oft nützlich, ein Protokoll aller Statusänderungen zu führen. Dies können Sie erreichen, indem Sie ein status_history-Array hinzufügen.

In diesem letzten Schritt aktualisieren Sie den Bestellstatus auf "in Bearbeitung" (processing) und beginnen mit dem Aufbau des status_history-Arrays. Der $push-Operator wird verwendet, um einen Wert an ein Array anzuhängen.

Zuerst fügen wir den anfänglichen "ausstehend"-Status zur Historie hinzu und aktualisieren den aktuellen Status auf "in Bearbeitung".

db.orders.updateOne(
  { order_id: "ORD001" },
  {
    $set: { status: "processing" },
    $push: {
      status_history: {
        status: "pending",
        timestamp: new Date("2023-10-26T10:00:00Z")
      }
    }
  }
);

Nun fügen wir den neuen "in Bearbeitung"-Status zur Historie hinzu, um das Protokoll vollständig zu halten.

db.orders.updateOne(
  { order_id: "ORD001" },
  {
    $push: {
      status_history: {
        status: "processing",
        timestamp: new Date("2023-10-26T11:30:00Z")
      }
    }
  }
);

Dieser Ansatz bietet eine vollständige Nachverfolgung des Lebenszyklus einer Bestellung. Sie können das Dokument abfragen, um jederzeit dessen vollständige Historie einzusehen.

db.orders.findOne({ order_id: "ORD001" });

Das Dokument enthält nun ein status_history-Array, das Ihnen einen vollständigen Überblick über den Verlauf der Bestellung gibt. Um die MongoDB-Shell zu verlassen, geben Sie exit ein und drücken Sie Enter.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie ein praktisches und effizientes MongoDB-Schema für eine E-Commerce-Bestellung entwerfen. Sie haben mit einem einfachen Dokument begonnen und es schrittweise durch das Einbetten verwandter Daten angereichert. Sie haben erfolgreich ein einzelnes Dokument erstellt, das Kundendetails, ein Array von Bestellpositionen, Zahlungsinformationen und eine vollständige Statusverlaufsübersicht enthält. Dieses eingebettete Dokumentenmuster ist ein Kernkonzept im MongoDB-Schema-Design, das zur Erstellung performanter und skalierbarer Anwendungen beiträgt, indem die Notwendigkeit komplexer Joins und mehrerer Abfragen reduziert wird.