MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mongoid store_in produz resultados aleatórios


Demorei um pouco, mas descobri a resposta. Resolvi postar, esperando que ajude outras pessoas.

Mongoid implementa algo que é chamado de "herança de tabela única". Assim que você derivar uma classe filho de uma classe pai, o filho será armazenado na coleção pai adicionando um atributo "tipo". O uso de "store_in" informa explicitamente ao mongodb em qual coleção armazenar os documentos. Definir o store_in na classe filha faz com que o mongoid armazene tudo (incluindo o pai) na coleção fornecida. Acho que usar atribuições store_in dedicadas para cada filho bagunça o mongoide. No entanto, o resultado é que os documentos são armazenados aleatoriamente em qualquer uma das coleções fornecidas.

Isso pode ser resolvido em Ruby usando um módulo como mixin para a funcionalidade comum. Isso é descrito muito bem em este documento .

MAS eu decidi não fazer isso afinal! A razão pela qual eu queria isso é para manter minhas coleções pequenas, na esperança de obter um melhor desempenho. Depois de conversar com alguns especialistas (10gen), acho que a melhor abordagem é usar a coleção de objetos pai único para todos os elementos filhos. Não deve haver impacto no desempenho do mongodb, mas a solução se torna muito mais flexível. Na verdade, isso faz um uso muito melhor do design sem esquema no mongodb.

Então o código ficará assim novamente:
class BaseClass
  include Mongoid::Document

  ... shared functionality

end

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

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