MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak zaimplementować has_many :poprzez relacje z Mongoid i mongodb?

Mongoid nie ma has_many :through ani równoważnej funkcji. Nie byłoby to tak przydatne w przypadku MongoDB, ponieważ nie obsługuje zapytań łączących, więc nawet jeśli możesz odwoływać się do powiązanej kolekcji za pośrednictwem innej, nadal wymagałoby to wielu zapytań.

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

Normalnie, jeśli masz relację wiele-wiele w RDBMS, modelujesz to inaczej w MongoDB, używając pola zawierającego tablicę „obcych” kluczy po obu stronach. Na przykład:

class Physician
  include Mongoid::Document
  has_and_belongs_to_many :patients
end

class Patient
  include Mongoid::Document
  has_and_belongs_to_many :physicians
end

Innymi słowy, wyeliminowałbyś tabelę złączeń i miałby podobny efekt do has_many :through pod względem dostępu do 'drugiej strony'. Ale w twoim przypadku jest to prawdopodobnie nieodpowiednie, ponieważ twoja tabela łączenia jest klasą Appointment, która zawiera dodatkowe informacje, a nie tylko powiązanie.

Sposób modelowania zależy w pewnym stopniu od zapytań, które musisz uruchomić, ale wydaje się, że będziesz musiał dodać model Spotkania i zdefiniować powiązania z Pacjentem i Lekarzem w następujący sposób:

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

W przypadku relacji w MongoDB zawsze musisz dokonać wyboru między dokumentami osadzonymi lub powiązanymi. W twoim modelu zgadywałbym, że MeetingNotes jest dobrym kandydatem do osadzonej relacji.

class Appointment
  include Mongoid::Document
  embeds_many :meeting_notes
end

class MeetingNote
  include Mongoid::Document
  embedded_in :appointment
end

Oznacza to, że możesz pobrać notatki razem ze spotkaniem, podczas gdy potrzebujesz wielu zapytań, jeśli jest to powiązanie. Musisz tylko pamiętać o limicie rozmiaru 16 MB dla pojedynczego dokumentu, który może mieć zastosowanie, jeśli masz bardzo dużą liczbę notatek ze spotkań.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Wysyłanie zapytań o rozmiar tablicy wewnętrznej w MongoDB

  2. Jak zainstalować MongoDB Community Edition na Ubuntu?

  3. Potok zbiorczy MongoDB powoli po pierwszym kroku dopasowania

  4. Przegląd wielodokumentowych transakcji ACID w MongoDB i jak z nich korzystać

  5. MongoDB, Mongoose:Jak znaleźć poddokument w znalezionym dokumencie?