sql >> データベース >  >> NoSQL >> MongoDB

has_manyを実装する方法:Mongoidおよびmongodbとの関係を介して?

    Mongoidには、has_many:throughまたは同等の機能はありません。結合クエリをサポートしていないため、MongoDBではあまり役に立ちません。そのため、別のコレクションを介して関連するコレクションを参照できたとしても、複数のクエリが必要になります。

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

    通常、RDBMSに多対多の関係がある場合は、MongoDBで、両側に「外部」キーの配列を含むフィールドを使用して、別の方法でモデル化します。例:

    class Physician
      include Mongoid::Document
      has_and_belongs_to_many :patients
    end
    
    class Patient
      include Mongoid::Document
      has_and_belongs_to_many :physicians
    end
    

    言い換えると、結合テーブルを削除すると、「反対側」へのアクセスに関して、has_many:throughと同様の効果があります。ただし、あなたの場合、結合テーブルは、関連付けだけでなく、いくつかの追加情報を運ぶAppointmentクラスであるため、おそらく適切ではありません。

    これをどのようにモデル化するかは、実行する必要のあるクエリにある程度依存しますが、予定モデルを追加し、患者と医師への関連付けを次のように定義する必要があるようです。

    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
    

    MongoDBのリレーションシップでは、埋め込みドキュメントと関連付けられたドキュメントのどちらかを常に選択する必要があります。あなたのモデルでは、MeetingNotesは埋め込まれた関係の良い候補だと思います。

    class Appointment
      include Mongoid::Document
      embeds_many :meeting_notes
    end
    
    class MeetingNote
      include Mongoid::Document
      embedded_in :appointment
    end
    

    これは、予定と一緒にメモをまとめて取得できることを意味しますが、これが関連付けである場合は複数のクエリが必要になります。非常に多くの会議メモがある場合に機能する可能性がある単一のドキュメントの16MBのサイズ制限に注意する必要があります。



    1. SparkでRedis:タスクをシリアル化できません

    2. 日付を文字列に変換するMongoDB

    3. Python3.5でのjson.loadsとRedis

    4. MongoDBの接続文字列(例付き)