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

¿Cómo implementar has_many:a través de relaciones con Mongoid y mongodb?

Mongoid no tiene has_many :through o una función equivalente. No sería tan útil con MongoDB porque no admite consultas de unión, por lo que incluso si pudiera hacer referencia a una colección relacionada a través de otra, aún requeriría múltiples consultas.

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

Normalmente, si tiene una relación de muchos a muchos en un RDBMS, lo modelaría de manera diferente en MongoDB usando un campo que contiene una matriz de claves 'foráneas' en cada lado. Por ejemplo:

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 otras palabras, eliminaría la tabla de unión y tendría un efecto similar a has_many :through en términos de acceso al 'otro lado'. Pero en su caso, eso probablemente no sea apropiado porque su tabla de unión es una clase de cita que contiene información adicional, no solo la asociación.

La forma en que modele esto depende en cierta medida de las consultas que necesite ejecutar, pero parece que necesitará agregar el modelo de Cita y definir asociaciones para Paciente y Médico algo como esto:

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

Con las relaciones en MongoDB, siempre tiene que elegir entre documentos incrustados o asociados. En su modelo, supongo que MeetingNotes es un buen candidato para una relación incrustada.

class Appointment
  include Mongoid::Document
  embeds_many :meeting_notes
end

class MeetingNote
  include Mongoid::Document
  embedded_in :appointment
end

Esto significa que puede recuperar todas las notas junto con una cita, mientras que necesitaría varias consultas si se tratara de una asociación. Solo debe tener en cuenta el límite de tamaño de 16 MB para un solo documento que podría entrar en juego si tiene una gran cantidad de notas de reuniones.