Definieren Sie ein Schema in MongoDB

Tahseen Tauseef 15 Februar 2024
  1. Schema in MongoDB
  2. Überlegungen zum Entwerfen eines Schemas in MongoDB
  3. Definieren Sie ein Schema in MongoDB
  4. Erzwinge ein Schema mit MongoDB Realm
Definieren Sie ein Schema in MongoDB

In diesem Artikel wird das MongoDB-Schema und seine Definition erläutert.

Schema in MongoDB

Die Struktur und der Inhalt Ihrer Daten werden durch ein Schema definiert, das ein JSON-Objekt ist. Die BSON-Schemas von Realm, die den JSON-Schema-Standard erweitern, können verwendet werden, um das Datenmodell Ihrer App zu entwerfen und Dokumente zu validieren, wann immer sie erstellt, geändert oder gelöscht werden.

Anstelle von genauen Werten repräsentieren Schemata verschiedene Arten von Daten. Viele integrierte Schematypen werden von Realm unterstützt. Primitive wie Texte, Zahlen und Strukturtypen wie Objekte und Arrays können kombiniert werden, um Schemata zu bilden, die benutzerdefinierte Objekttypen darstellen.

Beispielsweise ist unten ein Basisschema für Daten über Autos und einige Autoobjekte angegeben, die dem Schema entsprechen.

Schema:

{
  "title": "car",
  "required": [
    "_id",
    "year",
    "make",
    "model",
    "kilometers"
  ],
  "properties": {
    "_id": { "bsonType": "objectId" },
    "year": { "bsonType": "string" },
    "make": { "bsonType": "string" },
    "model": { "bsonType": "string" },
    "kilometers": { "bsonType": "number" }
  }
}

Objekte:

{
  "_id": ObjectId("5af712eff26b29dc5c51c60f"),
  "year": "2022",
  "make": "Honda",
  "model": "Civic",
  "kilometers": 123
}
{
  "_id": ObjectId("5af714eff24b294c5251cf04"),
  "year": "2016",
  "make": "Honda",
  "model": "City",
  "kilometers": 135794
}

Schemata sind die Datenmodellspezifikationen für Ihre Anwendung. Realm bietet Ihnen zusätzliche Tools und Dienste, um mit Daten zu arbeiten, die dem Schema entsprechen, sobald Sie es definiert haben.

Viele Anwendungsdienste in Realm verwenden Schemas:

  1. Um Daten zwischen Realms und MongoDB Atlas zu synchronisieren, verwendet Realm Sync Schemas. Basierend auf Ihren Schemas kann es auch idiomatische SDK-Objektmodelle für Sie entwickeln.
  2. Die GraphQL-API verwendet automatisch Schemas, um ein GraphQL-Schema zu generieren, das automatisch Typen, Abfragen und Mutationen enthält. Benutzerdefinierte Resolver, die auf die von Ihren Schemas definierten Typen verweisen, können der API Ihrer App hinzugefügt werden.
  3. Vor und nach jeder Anfrage stellen Datenzugriffsregeln sicher, dass die Daten Ihrem Schema entsprechen. Darüber hinaus verhindert Realm die gesamte Anfrage oder setzt sie zurück, wenn ein Dokument die Validierung nicht besteht.

Überlegungen zum Entwerfen eines Schemas in MongoDB

  1. Gestalten Sie Ihr Schema gemäß den Benutzeranforderungen.
  2. Wenn Sie die Objekte zusammen verwenden, kombinieren Sie sie zu einem einzigen Dokument. Trennen Sie sie bei Bedarf (stellen Sie jedoch sicher, dass keine Verknüpfungen erforderlich sind).
  3. Duplizieren Sie die Daten (aber begrenzt), da Speicherplatz billiger ist als Rechenzeit.
  4. Joins beim Schreiben, nicht beim Lesen.
  5. Optimieren Sie Ihr Schema für die häufigsten Anwendungsfälle.
  6. Führen Sie eine komplexe Aggregation im Schema durch.

Nachfolgend ein Beispiel zur Erläuterung:

Angenommen, ein Kunde benötigt ein Datenbankdesign für seinen Blog oder seine Website und sieht die Unterschiede zwischen RDBMS- und MongoDB-Schemadesign. Die Website hat die folgenden Anforderungen.

  1. Jeder Beitrag hat einen eindeutigen Titel, eine Beschreibung und eine URL.
  2. Jeder Beitrag kann einen oder mehrere Tags haben.
  3. Jeder Beitrag hat den Namen des Herausgebers und die Gesamtzahl der Likes.
  4. Jeder Post enthält Benutzerkommentare und deren Namen, Nachricht, Datenzeit und Likes.
  5. Zu jedem Beitrag können keine oder mehrere Kommentare vorhanden sein.

Im RDBMS-Schema weist das Design für die oben genannten Anforderungen mindestens drei Tabellen auf.

RDBMS-Schemadesign

Im MongoDB-Schema hat das Design einen Sammlungsposten und die folgende Struktur:

{
  _id: POST-ID
  title: TITLE-OF-POST,
  description: POST-DESCRIPTION,
  by: POST-BY,
  url: URL-OF-POST,
  tags: [TAG1, TAG2],
  likes: TOTAL-LIKES,
  comments: [
    {
        user: 'COMMENT-BY',
        message: TEXT,
        dateCreated: DATE-TIME,
        like: LIKES
    },
    {
        user: 'COMMENT-BY',
        message: TEXT,
        dateCreated: DATE-TIME,
        like: LIKES
    }
  ]
}

In RDBMS müssen Sie also drei Tabellen kombinieren, um die Daten anzuzeigen; In MongoDB werden jedoch nur Daten aus einer Sammlung angezeigt.

Definieren Sie ein Schema in MongoDB

Zusätzliche Schemas, die die Attribute des Typs angeben, können in einem Sammlungsschema auf Stammebene gefunden werden. Jedes Root-Level-Schema ist ein Objekt-Schema, das wie folgt aussieht:

{
  "bsonType": "object",
  "title": "<Type Name>",
  "required": ["<Required Field Name>", ...],
  "properties": {
    "<Field Name>": <Schema>
  }
}

Der Benutzer kann einen der folgenden unterstützten Schematypen verwenden, um die Eigenschaften des Objekts zu konfigurieren:

  1. Objekt
  2. Array
  3. Schnur
  4. Boolesch
  5. Objekt-ID
  6. Binäre Daten
  7. Gemischt
  8. Einstellen
  9. Wörterbuch

Erzwinge ein Schema mit MongoDB Realm

Alle Schreibvorgänge (Einfügungen, Aktualisierungen und Löschungen) in einer MongoDB-Sammlung werden von MongoDB Realm anhand des Sammlungsschemas validiert.

Es untersucht auch jedes Dokument vor und nach jeder Anforderung, um sicherzustellen, dass alle Eigenschaften mit dem Schema übereinstimmen und keine ungültigen Änderungen vorgenommen werden.

Bevor die Schreibvorgänge an Ihren Cluster übergeben werden, überprüft Realm die Ergebnisse aller Dokumentschreibvorgänge und vergleicht sie mit dem Schema.

MongoDB Realm liefert einen Fehler an den Benutzer, wenn das Ergebnis eines Schreibvorgangs in einer Anfrage nicht zum Schema passt, ohne dass Änderungen an der Anfrage vorgenommen werden.

Ein Beispiel dafür ist unten angegeben. Eine Sammlung hat das folgende Schema:

{
  "title": "person",
  "properties": {
    "_id": {"bsonType": "objectId" },
    "name": {"bsonType": "string" }
    }
}

Ein Benutzer mit vollem Zugriff auf alle Felder möchte das Feld name in einem bestimmten Dokument ändern. Sie erkundigen sich nach Folgendem:

collection.updateOne(
  { "_id": BSON.ObjectId("5ae782e48f25b9dc5c51c4d0") },
  { "$set": { "name": 22 } }
)

Die Abfrage versucht, den Wert name auf die Zahl 22 zu setzen. Trotzdem gibt das Schema an, dass der Wert eine Zeichenfolge ist.

Selbst wenn der Benutzer die Autorisierung zum Aktualisieren des Dokuments erhalten hat, würde MongoDB Realm diesen Schreibvorgang ablehnen, da das Schreibergebnis nicht dem Schema entspricht.