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

Comment implémenter has_many :via des relations avec Mongoid et mongodb ?

Mongoid n'a pas has_many :through ou une fonctionnalité équivalente. Ce ne serait pas aussi utile avec MongoDB car il ne prend pas en charge les requêtes de jointure, donc même si vous pouviez référencer une collection associée via une autre, cela nécessiterait toujours plusieurs requêtes.

https://github.com/mongoid/mongoid/issues/544

Normalement, si vous avez une relation plusieurs-plusieurs dans un SGBDR, vous modélisez cela différemment dans MongoDB en utilisant un champ contenant un tableau de clés "étrangères" de chaque côté. Par exemple :

class Physician
  include Mongoid::Document
  has_and_belongs_to_many :patients
end

class Patient
  include Mongoid::Document
  has_and_belongs_to_many :physicians
end

En d'autres termes, vous élimineriez la table de jointure et cela aurait un effet similaire à has_many :through en termes d'accès à "l'autre côté". Mais dans votre cas, ce n'est probablement pas approprié car votre table de jointure est une classe de rendez-vous qui contient des informations supplémentaires, pas seulement l'association.

La façon dont vous modélisez cela dépend dans une certaine mesure des requêtes que vous devez exécuter, mais il semble que vous devrez ajouter le modèle de rendez-vous et définir des associations pour le patient et le médecin, comme ceci :

class Physician
  include Mongoid::Document
  has_many :appointments
end

class Appointment
  include Mongoid::Document
  belongs_to :physician
  belongs_to :patient
end

class Patient
  include Mongoid::Document
  has_many :appointments
end

Avec les relations dans MongoDB, vous devez toujours faire un choix entre des documents intégrés ou associés. Dans votre modèle, je suppose que MeetingNotes est un bon candidat pour une relation intégrée.

class Appointment
  include Mongoid::Document
  embeds_many :meeting_notes
end

class MeetingNote
  include Mongoid::Document
  embedded_in :appointment
end

Cela signifie que vous pouvez récupérer toutes les notes avec un rendez-vous, alors que vous auriez besoin de plusieurs requêtes s'il s'agissait d'une association. Il faut juste garder à l'esprit la limite de taille de 16 Mo pour un seul document qui peut entrer en jeu si vous avez un très grand nombre de notes de réunion.