sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongoid store_in produce resultados aleatorios

Me tomó un tiempo pero descubrí la respuesta. Decidí publicarlo, con la esperanza de que ayude a otros.

Mongoid implementa algo que se llama "herencia de tabla única". Tan pronto como obtenga una clase secundaria de una clase principal, la secundaria se almacenará en la colección principal agregando un atributo de "tipo". El uso de "store_in" le dice a mongodb explícitamente en qué colección almacenar los documentos. Definir store_in en la clase secundaria hace que mongoid almacene todo (incluido el padre) en la colección dada. Supongo que usar asignaciones store_in dedicadas para cada niño estropea mongoide. Sin embargo, el resultado es que los documentos se almacenan aleatoriamente en cualquiera de las colecciones dadas.

Esto se puede resolver en Ruby usando un módulo como complemento para la funcionalidad común. Esto se describe bastante bien en este documento .

¡PERO decidí no hacer esto después de todo! La razón por la que quería esto es para mantener pequeñas mis colecciones, con la esperanza de obtener un mejor rendimiento. Después de hablar con algunos expertos (10gen), creo que el mejor enfoque es usar la colección de objetos principales únicos para todos los elementos secundarios. No debería haber ningún impacto en el rendimiento de mongodb, pero la solución se vuelve mucho más flexible. De hecho, esto hace mucho mejor uso del diseño sin esquema en mongodb.

Así que el código se verá así de nuevo:

class BaseClass
  include Mongoid::Document

  ... shared functionality

end

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

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