MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongoid store_in produit des résultats aléatoires

Ça m'a pris du temps mais j'ai trouvé la réponse. J'ai décidé de le publier, en espérant que cela aidera les autres.

Mongoid implémente quelque chose qui s'appelle "l'héritage de table unique". Dès que vous dérivez une classe enfant d'une classe parent, l'enfant serait stocké dans la collection parent en ajoutant un attribut "type". L'utilisation de "store_in" indique explicitement à mongodb dans quelle collection stocker les documents. La définition de store_in dans la classe enfant permet à mongoid de tout stocker (y compris le parent) dans la collection donnée. Je suppose que l'utilisation d'affectations store_in dédiées pour chaque enfant gâche mongoid. Cependant, le résultat est que les documents sont stockés de manière aléatoire dans l'une des collections données.

Cela peut être résolu dans Ruby en utilisant un module comme mixin pour la fonctionnalité commune. Ceci est assez bien décrit dans ce document .

MAIS j'ai décidé de ne pas le faire après tout ! La raison pour laquelle je voulais cela est de garder mes collections petites, dans l'espoir d'obtenir de meilleures performances. Après avoir parlé à des experts (10gen), je pense que la meilleure approche consiste à utiliser la collection d'objets parent unique pour tous les éléments enfants. Il ne devrait pas y avoir d'impact sur les performances de mongodb mais la solution devient beaucoup plus flexible. En fait, cela permet une bien meilleure utilisation de la conception sans schéma dans mongodb.

Ainsi, le code ressemblera à nouveau à ceci :

class BaseClass
  include Mongoid::Document

  ... shared functionality

end

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

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