HOWTO · MongoDB

Maximale MongoDB-Dokumentgröße

Dieses Tutorial beschreibt die maximale Dokumentengröße in MongoDB. Außerdem erfahren Sie, wie Sie die standardmäßige BSON-Größenbegrenzung effizient nutzen und Daten speichern, wenn sie die Begrenzung zum Speichern von Dokumenten überschreiten.

Auf dieser Seite

MongoDB begrenzt jedes BSON-Dokument auf 16 MB. Wenn ein Datensatz größer wird, können Sie seine codierte Größe verringern oder einen Teil der Daten in andere Dokumente auslagern; für große Dateien kommt GridFS infrage. Die Begrenzung gilt für jedes einzelne Dokument, nicht für die Gesamtgröße einer Collection und auch nicht für eine Datei, die durch mehrere GridFS-Dokumente dargestellt wird.

Maximale BSON-Dokumentgröße in MongoDB

MongoDB speichert Datensätze in BSON, einem Binärformat für JSON-ähnliche Dokumente. BSON unterstützt zusätzliche Datentypen wie Datumsangaben und Binärdaten. Laut der Dokumentation zu den MongoDB-Grenzwerten beträgt die maximale Größe eines einzelnen BSON-Dokuments 16 MB; außerdem ist die Verschachtelung auf maximal 100 Ebenen begrenzt. Arrays und eingebettete Dokumente tragen zur Verschachtelungstiefe bei.

Gemessen wird die Größe des codierten BSON-Dokuments einschließlich Feldnamen, Typmarkierungen, Längenangaben und weiterem strukturellem Aufwand. Daher lässt sich aus der Länge eines JSON-Strings oder der Anzahl der Werte allein nicht ableiten, ob ein Dokument unter die Grenze passt. Planen Sie beim Entwurf von Datensätzen einen Abstand zum Höchstwert ein und messen Sie repräsentative Dokumente mit den BSON-Werkzeugen des Treibers Ihrer Anwendung, bevor Sie sich auf eine Größenschätzung verlassen.

So speichert GridFS Dateien, die größer als die Dokumentgrenze sind

GridFS ist eine MongoDB-Spezifikation zum Speichern und Abrufen von Dateien, die die Grenze für einzelne Dokumente überschreiten. Eine GridFS-Implementierung teilt eine Datei in Blöcke auf, die als separate Dokumente gespeichert werden. Standardmäßig verwendet sie die Collection fs.files für Dateimetadaten und die Collection fs.chunks für die Blockdaten. Ein Dateidokument identifiziert die Datei; jeder Block verweist über files_id auf dieses Dokument.

So lässt sich eine große Datei in Teilen verarbeiten; ein einzelnes übergroßes BSON-Dokument wird dadurch nicht zulässig. Verwenden Sie die GridFS-Unterstützung Ihres MongoDB-Treibers, um Dateien hochzuladen, abzurufen oder als Stream zu verarbeiten. Blockgröße und API-Details hängen von Implementierung und Konfiguration ab. Schlagen Sie deshalb in der Dokumentation des verwendeten Treibers nach.

So bleibt ein BSON-Dokument innerhalb der Grenze

Prüfen Sie zunächst, welche Felder den größten Anteil an der codierten Größe haben. Entfernen Sie Daten, die sich ableiten lassen, vermeiden Sie die Wiederholung großer Werte und wählen Sie kompakte Darstellungen, sofern sie verständlich und wartbar bleiben. Eine Zeichenfolge im Anwendungscode zu komprimieren ist nur dann sinnvoll, wenn die Anwendung die resultierenden Binärdaten speichern und interpretieren kann; außerdem entstehen zusätzlicher Verarbeitungsaufwand und mögliche Kompatibilitätsfragen.

Enthält ein Feld nur wenige wiederkehrende Zeichenfolgen, kann eine Wörterbuchcodierung jede unterschiedliche Zeichenfolge einmal speichern und ihre Vorkommen durch einen Index darstellen. Das folgende Python-Beispiel veranschaulicht diese Umwandlung im Arbeitsspeicher; es berechnet weder die BSON-Größe noch stellt es eine Verbindung zu MongoDB her.

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

values = ["pending", "complete", "pending", "pending"]
dictionary = list(dict.fromkeys(values))
indexes = [dictionary.index(value) for value in values]
print(dictionary)
print(indexes)

Eine Wörterbuchcodierung kann wiederholten Text reduzieren. Indizes erschweren jedoch das Prüfen der Datensätze, und das Wörterbuch muss verfügbar und konsistent bleiben. Bei überwiegend einmaligen Werten hilft das Verfahren möglicherweise nicht; auch die zusätzliche Struktur benötigt Speicherplatz. Messen Sie repräsentative codierte Dokumente, statt anzunehmen, dass eine Umwandlung garantiert unter die Grenze führt.

Die passende Speicherstrategie wählen, wenn Daten die Grenze überschreiten

Verwenden Sie ein kleineres Dokument, wenn die Daten zusammengehören und sich kompakter darstellen lassen, ohne benötigte Informationen zu verlieren. Teilen Sie Daten auf zusammengehörige Dokumente auf, wenn Teile einen eigenen Lebenszyklus haben oder unabhängig voneinander gelesen werden. Behalten Sie eine stabile Kennung oder Referenz bei, damit die Anwendung die zugehörigen Datensätze abrufen kann. Dadurch können Abfragen zusätzliche Lesevorgänge erfordern; auch zusammengehörige Aktualisierungen müssen sorgfältig gehandhabt werden.

Verwenden Sie GridFS für große Dateiinhalte wie Bilder, Audio- oder Videodateien, wenn die Anwendung die Dateispeicher- und Abruffunktionen von MongoDB benötigt. Speichern Sie durchsuchbare oder häufig abgefragte Attribute in gewöhnlichen Dokumenten und hinterlegen Sie dort eine Referenz auf die GridFS-Datei. GridFS ist nicht die Standardlösung für jeden zu großen Datensatz: Entscheiden Sie zuerst, ob es sich um eine Datei, zusammengehörige strukturierte Daten oder einfach um ein Dokument handelt, das sich verkleinern lässt.