MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongoid store_in erzeugt zufällige Ergebnisse

Es hat eine Weile gedauert, aber ich habe die Antwort herausgefunden. Ich habe mich entschieden, es zu posten, in der Hoffnung, dass es anderen helfen wird.

Mongoid implementiert etwas, das als "Single Table Inheritance" bezeichnet wird. Sobald Sie eine untergeordnete Klasse von einer übergeordneten Klasse ableiten, wird die untergeordnete Klasse in der übergeordneten Sammlung gespeichert, indem ein "Typ" -Attribut hinzugefügt wird. Die Verwendung von „store_in“ teilt mongodb explizit mit, in welcher Sammlung Dokumente gespeichert werden sollen. Durch die Definition von store_in in der untergeordneten Klasse speichert mongoid alles (einschließlich der übergeordneten Klasse) in der angegebenen Sammlung. Ich denke, die Verwendung einer dedizierten store_in-Zuweisung für jedes Kind bringt Mongoid durcheinander. Das Ergebnis ist jedoch, dass Dokumente zufällig in einer der angegebenen Sammlungen gespeichert werden.

Dies kann in Ruby mit einem Modul als Mixin für die allgemeine Funktionalität gelöst werden. Dies ist ziemlich gut beschrieben in dieses Dokument .

ABER ich habe beschlossen, dies doch nicht zu tun! Der Grund, warum ich das wollte, ist, meine Sammlungen klein zu halten, in der Hoffnung, eine bessere Leistung zu erzielen. Nachdem ich mit einigen (10gen) Experten gesprochen habe, denke ich, dass der bessere Ansatz darin besteht, die einzelne übergeordnete Objektsammlung für alle untergeordneten Elemente zu verwenden. Es sollte keine Auswirkungen auf die Leistung von mongodb geben, aber die Lösung wird viel flexibler. Tatsächlich nutzt dies das schemalose Design in mongodb viel besser aus.

Der Code sieht also wieder so aus:

class BaseClass
  include Mongoid::Document

  ... shared functionality

end

class ChildClass1 < BaseClass
  ...individual functionality...
end  

class ChildClass2 < BaseClass
  ...individual functionality...
end