MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongoid store_in produce risultati casuali

Mi ci è voluto un po' ma ho capito la risposta. Ho deciso di pubblicarlo, sperando che possa aiutare gli altri.

Mongoid implementa qualcosa che viene chiamato "ereditarietà tabella singola". Non appena si deriva una classe figlio da una classe padre, il figlio verrà archiviato nella raccolta padre aggiungendo un attributo "tipo". L'uso di "store_in" indica a mongodb in modo esplicito in quale raccolta archiviare i documenti. Definire store_in nella classe figlia fa sì che mongoid memorizzi tutto (incluso il genitore) nella raccolta data. Immagino che l'uso di incarichi store_in dedicati per ogni bambino incasini mongoid. Tuttavia, il risultato è che i documenti vengono archiviati casualmente in una qualsiasi delle raccolte date.

Questo può essere risolto in Ruby usando un modulo come mixin per la funzionalità comune. Questo è descritto abbastanza bene in questo documento .

MA dopotutto ho deciso di non farlo! Il motivo per cui ho voluto questo è per mantenere piccole le mie collezioni, sperando di ottenere prestazioni migliori. Dopo aver parlato con alcuni esperti (10gen) penso che l'approccio migliore sia utilizzare la raccolta di oggetti genitore singolo per tutti gli elementi figlio. Non dovrebbe esserci alcun impatto sulle prestazioni di mongodb, ma la soluzione diventa molto più flessibile. In effetti, questo fa un uso molto migliore del design senza schema in mongodb.

Quindi il codice apparirà di nuovo così:

class BaseClass
  include Mongoid::Document

  ... shared functionality

end

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

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