Ich kann keinen Blogbeitrag oder Dokumentation darüber finden. Beide, eingebetteter Dokument- und Hash-Datentyp, sind sich sehr ähnlich. Was ist der Vorteil oder die Einschränkung von jedem über den anderen?
Betrachten Sie mein Schemadesign:
%Vor%Soll ich mehrere eingebettete Dokumente in dieser HistoryTracker-Klasse erstellen? oder einfach das benutzen? Wie wäre es mit der Indizierung?
Mongoid speichert eingebettete Dokumente und Hash-Attribute auf Datenbankebene ziemlich genau. Es ist normal, wenn Sie mit Mongoiden arbeiten, um Ihre Felder in Ihren Modellen zu deklarieren. Wenn Sie also eine verschachtelte Struktur haben, ist es normal, ein eingebettetes Dokument zu erstellen. Da MongoDB schemaloses Mongoid ist, müssen Sie Felder deklarieren, um sie in der gleichen Art von API wie ActiveRecord darzustellen. Aber für einige Anwendungsfälle gibt ein Hash-Attribut ein bisschen mehr Flexibilität. Der Nachteil dieser Flexibilität besteht darin, dass Sie auf die Hash-API beschränkt sind, sodass Sie keine automatisch generierten Attributmethoden erhalten und Geschäftslogik nicht so kapseln können, wie Sie es normalerweise in einer Modellklasse tun würden.
Angenommen, Sie haben ein Fragebogenmodell, in dem Sie viele Abschnitte speichern müssen, die viele Frage-Antwort-Paare enthalten. Wenn eine Schlüsselanforderung des Systems darin besteht, dass der Administrator neue Abschnitte und Fragen einrichten kann, können Sie die Antworten nicht einfach als normales eingebettetes Dokument mit expliziten Feldern für jede Frage modellieren. Für solche Dinge könnte ein Hash mehr Sinn machen.
Ich weiß nicht, was Ihre spezifischen Anforderungen sind, aber als grobe Richtlinie würde ich sagen, dass wenn Sie mit einem festen Schemastock mit einem eingebetteten Dokument arbeiten, aber wenn Sie ein offenes Modell benötigen Hash-Attribute / p>
Ein Problem, das ich bei der Verwendung von Hashes anstelle von eingebetteten Dokumenten gesehen habe
Wenn Mongoid gerade dabei ist, ein Dokument zu serialisieren, sucht es derzeit nicht nach verschachtelten Hash-Werten und geht davon aus, dass sie bereits serialisiert sind.
Wenn Sie also einen "Hash Dump" wie den folgenden haben möchten
%Vor%Dann können Sie keine Objekte in den Eigenschaften
verwenden %Vor% Der Versuch, das folgende Ereignis beizubehalten, wird einen Absturz verursachen, weil Foo nicht serialisiert wird (probiere e.as_document
aus und du wirst sehen, dass der Wert von some_info
nicht serialisiert wird)
Verweise auf die Probleme: Github , MongoDB-Tracker