MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come implementare has_many :attraverso le relazioni con Mongoid e mongodb?

Mongoid non ha has_many :through o una funzionalità equivalente. Non sarebbe così utile con MongoDB perché non supporta le query di join, quindi anche se potessi fare riferimento a una raccolta correlata tramite un'altra, richiederebbe comunque più query.

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

Normalmente se hai una relazione molti-molti in un RDBMS lo modelleresti in modo diverso in MongoDB usando un campo contenente una matrice di chiavi "estranee" su entrambi i lati. Ad esempio:

class Physician
  include Mongoid::Document
  has_and_belongs_to_many :patients
end

class Patient
  include Mongoid::Document
  has_and_belongs_to_many :physicians
end

In altre parole elimineresti la tabella di join e avrebbe un effetto simile a has_many :through in termini di accesso all '"altro lato". Ma nel tuo caso probabilmente non è appropriato perché la tua tabella di join è una classe Appointment che contiene alcune informazioni extra, non solo l'associazione.

Il modo in cui lo modelli dipende in una certa misura dalle query che devi eseguire, ma sembra che dovrai aggiungere il modello Appuntamento e definire associazioni a paziente e medico in qualcosa del genere:

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 le relazioni in MongoDB devi sempre scegliere tra documenti incorporati o associati. Nel tuo modello immagino che MeetingNotes sia un buon candidato per una relazione incorporata.

class Appointment
  include Mongoid::Document
  embeds_many :meeting_notes
end

class MeetingNote
  include Mongoid::Document
  embedded_in :appointment
end

Ciò significa che puoi recuperare le note insieme a un appuntamento tutti insieme, mentre avresti bisogno di più query se si trattasse di un'associazione. Devi solo tenere a mente il limite di dimensione di 16 MB per un singolo documento che potrebbe entrare in gioco se hai un numero molto elevato di note di riunione.