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

Hvordan implementerer man has_many :gennem relationer med Mongoid og mongodb?

Mongoid har ikke has_many :through eller en tilsvarende funktion. Det ville ikke være så nyttigt med MongoDB, fordi det ikke understøtter joinforespørgsler, så selvom du kunne referere til en relateret samling via en anden, ville det stadig kræve flere forespørgsler.

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

Normalt, hvis du har et mange-mange forhold i et RDBMS, ville du modellere det anderledes i MongoDB ved at bruge et felt, der indeholder en række 'fremmede' nøgler på begge sider. For eksempel:

class Physician
  include Mongoid::Document
  has_and_belongs_to_many :patients
end

class Patient
  include Mongoid::Document
  has_and_belongs_to_many :physicians
end

Med andre ord ville du eliminere join-tabellen, og den ville have en lignende effekt som has_many :through med hensyn til adgang til 'den anden side'. Men i dit tilfælde er det sandsynligvis ikke passende, fordi dit mødebord er en aftaleklasse, som indeholder nogle ekstra oplysninger, ikke kun foreningen.

Hvordan du modellerer dette afhænger til en vis grad af de forespørgsler, du skal køre, men det ser ud til, at du bliver nødt til at tilføje aftalemodellen og definere associationer til patient og læge noget som dette:

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

Med relationer i MongoDB skal du altid vælge mellem indlejrede eller tilknyttede dokumenter. I din model vil jeg gætte på, at MeetingNotes er en god kandidat til et indlejret forhold.

class Appointment
  include Mongoid::Document
  embeds_many :meeting_notes
end

class MeetingNote
  include Mongoid::Document
  embedded_in :appointment
end

Det betyder, at du kan hente notaterne sammen med en aftale samlet, mens du ville have brug for flere forespørgsler, hvis dette var en forening. Du skal bare huske størrelsesgrænsen på 16 MB for et enkelt dokument, som kan komme i spil, hvis du har et meget stort antal mødenotater.



  1. Hvordan kan jeg pop objekter fra Redis, når de tilføjes i realtid?

  2. MongoDB tændt med Docker kunne ikke oprette forbindelse til serveren [localhost:27017] ved første forbindelse

  3. Opdater array-objekt baseret på id?

  4. Aggregerer i lokal tidszone i mongodb