2012-06-25 5 views
6

Ich habe die Sammlung domain mit Dokumenten, die Domain-Informationen enthalten. Ein Teil davon sind die historischen whois-Datensätze, die null oder mehr sein können und bei weitem den größten Teil des Platzes für das Dokument einnehmen.MongoDB: Wird beim Speichern eines Dokuments das gesamte Dokument neu geschrieben?

Wenn ich das gesamte Dokument laden, ändern Sie etwas klein (wie ein Zahlenfeld aktualisieren) und verwenden Sie die save() Methode wird mongo das gesamte Dokument auf die Festplatte leeren oder nur die BSON aktualisieren, die geändert hat? Letztendlich ist meine Frage, sollte ich mich bemühen, meinen Code mit update() zu verkomplizieren, um auf I/O zu sparen, oder sollte ich einfach save() verwenden?

Dies ist nicht nur wegen der Lazyness, das Dokument (nachdem es vollständig gelesen wird) durchläuft eine Reihe von Schritten zum Ändern/Verarbeiten des Dokuments und wenn Änderungen vorgenommen wurden, wird das gesamte Dokument gespeichert. Aber wenn die Kosten zum Speichern des Dokuments hoch sind, dann muss ich vielleicht anders darüber nachdenken ...

Antwort

4

Sie können ein einzelnes Feld in einem Dokument mit $set aktualisieren. Dadurch wird das Feld auf der Festplatte geändert. Jedoch, if the document grows beyond the size before the update, the document may have to be relocated on disk.

Inzwischen here is what the documentation says about save versus update:

>// x is some JSON style object 
>db.mycollection.save(x); // updates if exists; inserts if new 
> 
>// equivalent to: 
>db.mycollection.update({ _id: x._id }, x, /*upsert*/ true); 

Referenzen

+0

Das ist hilfreich, aber es beantwortet meine Frage nicht wirklich. Wenn ich ein 10mb BSON-Dokument habe, lese ich es eine Eigenschaft ändern und speichern es wird es die volle 10mb wieder schreiben? Angenommen, das Dokument muss nicht verschoben werden. –

+0

Das Detail auf * "ist das Ganze geschrieben" * hängt von der Tatsache ab, dass MongoDB Speicherkarten verwendet. Wenn Sie nur eine einzelne Eigenschaft aktualisieren, werden im Idealfall nur diese Bytes auf die Festplatte geschrieben. Wenn sich der BSON jedoch genug ändert, kann * * * das ganze Ding auf die Festplatte gespült werden. –

+1

@GatesVP: Ich dachte, dass die ganze Seite als schmutzig markiert ist und gespült werden muss. –

2

Das hängt von einer Client-Bibliothek ab, die Sie verwenden. Zum Beispiel ist Mongoid (ODM in Ruby) intelligent genug, um nur Felder zu senden, die geändert wurden (mit dem Befehl $set). Es ist manchmal zu schlau und erfasst keine Änderungen, die ich an verschachtelten Hashes vorgenommen habe. Aber ich habe noch nie gesehen, dass es unveränderte Felder sendet.

Andere Bibliotheken/Treiber können sich anders verhalten.

0

Ich weiß, dass diese Frage alt ist, aber es ist sehr nützlich zu wissen, wie es funktioniert, um Ihnen zu helfen, Ihre Datenbankstruktur zu entwerfen. Hier sind die Details zur Speicher-Engine von MongoDB:

Das Dokument beantwortet die Frage. Wenn Sie ein Integer-Feld in MongoDB aktualisieren, markiert es grundsätzlich die Seite (normalerweise 4k) im Speicher, in der sich die Ganzzahl befindet, um schmutzig zu sein, und die Speicherseite wird beim nächsten Disk-Flush auf die Festplatte geschrieben. Wenn Ihre Dokumentgröße sehr groß ist, besteht die Möglichkeit, dass Ihr Dokument nur teilweise in die Festplatte geschrieben wird.

Es gibt jedoch viele andere Fälle. Wenn Sie mehr Daten in Ihrem Dokument auffüllen, besteht die Möglichkeit, dass MongoDB das gesamte Dokument an einen neuen Speicherort verschieben muss, damit das Dokument vergrößert wird. In diesem Fall wird das gesamte Dokument auf die Festplatte geschrieben.

Verwandte Themen