Das Schema

Die Verwendung der JSON Schema Validierung ist in der Community Edition von Mongo Management Studio nicht enthalten.

Ein Highlight von Mongo Management Studio ist die optionale JSON Schema Validierung. Diese basiert auf dem Modul lx-valid und erlaubt die Validierung der Datensätze anhand von Datentypen und Formaten. Da MongoDB die Daten schemalos speichert, kann man in einem Datensatz in jedem Feld speichern, was man will. Das ist gerade bei Produktiv-Datenbanken kritisch. Mit aktivierter JSON Schema Validierung kann man z.B verhindern, das versehentlich eine MongoDB ObjectId als string oder ein Object als number abgespeichert wird. Die Validierung ist beim Erstellen und Bearbeiten von Datensätzen verfügbar.

Die Validierung über das Schema ist optional und in den Grundeinstellungen deaktiviert.

Lädt man eine Collection, wird automatisch ein Schema auf Basis der aus der Abfrage ermittelten Datensätze erzeugt. Existiert bereits ein abgespeichertes Schema, wird dieses geladen. Im Tab "JSON Schema" kann man das Schema ansehen und bearbeiten. Hat man das Schema geändert, kann man es mit Klick auf den Button "Schema speichern" abspeichern. Klickt man den Button "Schema neu generieren" wird das Schema anhand aller in der Collection vorhandenen Datensätze neu erstellt.

Ein weiterer Aspekt ist die Syntax des Schemas. Diese ist so angelegt, dass der Anwender in der Lage ist, ein Schema mittels Copy/Paste aus dem MongoDB Management Studio heraus in eigene Anwendungen hineinzukopieren, um damit zu arbeiten. Zum Beispiel verwendet das Modul lx-mongodb das JSON Schema, um Daten in MongoDB zu speichern. Der Anwender hat somit die Möglichkeit, das Schema zuerst mit Testdaten zu bearbeiten, zu modifizieren, um es dann produktiv in Anwendungen mit Datenbank-Operationen einzusetzen und so eine Typsicherheit der Daten zu ermöglichen.

Das Schema für eine Collection wird innerhalb von Mongo Management Studio gespeichert und nicht in der Mongo Datenbank. Es wird auch nur innerhalb der Anwendung verwendet. Es hat keinen Einfluss auf die Nutzung der Mongo Datenbank außerhalb dieser Anwendung.

Aufbau des Schemas am Beispiel der zipcode-Collection

Hat man das Erste Schritte Tutorial durchgeführt, hat man eine Datenbank demo mit der Collection zipcode. Wenn man die Collection öffnet und einen Datensatz bearbeitet, sieht man folgendes Schema im Tab "JSON Schema".

Type

Type bestimmt den Datentyp eines Feldes. Folgende Datentypen werden unterstützt:

  • string

  • array

  • object

  • number

  • integer

  • float

  • boolean

  • null

  • date

  • regexp

  • any

Speichert man nun z.B das Feld city mit dem Wert 23 ab, erhält man eine Fehlermeldung. Das Feld city ist von Typ string, und 23 ist kein string.

Felder können innerhalb einer Collection auch mehrere Datentypen besitzen. Wird zum Beispiel ein Datensatz mit dem Feld „pop: null“ ohne Validierung abgespeichert, so ändert sich das Schema nach erneuter Find-Abfrage wie folgt:

Das Feld „pop“ kann nun vom Typ Null oder Integer sein. 

Format

Einige Datentypen besitzen im Schema eine besondere Formatierung. Zu diesen Typen gehören unter anderem die MongoDB ObjectId oder Datumswerte. Da Mongo Management Studio die Daten mit JSON überträgt, werden solche Datentypen immer in einen string umgewandelt. Damit in der Mongo Datenbank die richtigen Datentypen gespeichert werden, verwendet man hier den Typ string, bei dem man zusätzlich ein Format angeben kann. Alle unterstützen Format finden sie hier https://github.com/litixsoft/lx-valid#validation-formats

// MongoDB ObjectId _id: { type: 'string', format: 'mongo-id' }   // Datum start: { type: 'string', format: 'date-time' }

Required

Ist “required” auf true gesetzt, so ist die Validierung des Datensatzes nur erfolgreich, wenn das betreffende Feld existiert. Fehlt das Feld, dann wird ein Fehler ausgegeben.

Im Beispiel wurde das Feld „city“ mit der Option „required“ versehen. Versucht man nun einen Datensatz ohne „city“ abzuspeichern, erhält man eine Fehlermeldung. Der Datensatz wurde nicht gespeichert, da das Feld „city“ leer ist.