2017-04-05 7 views
1

MongoDBスキーマデザインにネストされたドキュメント構造を使用する予定です。私はフラットスキーマデザインにしたくありません。私の場合、1つのクエリでのみ結果を取得する必要があります。mongodbでネストされたドキュメント構造を使用する

MongoDBにはドキュメントのサイズ制限があります。 MongoDB Limits and Threshold

A MongoDB document has a size limit of 16MB (an amount of data). If your subcollection can growth without limits go flat.

私は、ネストされたデータをフェッチする必要はありませんが、唯一のフィルタリングのための私のネストされたデータを必要とし、目的を照会すること。

質問とフィルタリングの目的でのみ埋め込みデータを使用してもネストされたデータをフェッチしない場合でもMongoDBのサイズ制限に拘束されるかどうかを知りたいのですが、この場合はMongoDB完全なドキュメントをメモリにロードせず、選択したフィールドのみをロードしますか?

ネストされたスキーマの設計例

{ 
    clinicName: "XYZ Hopital", 
    clinicAddress: "ABC place.", 
    "doctorsWorking":{ 
     "doctorId1":{ 
      "doctorJoined": ISODate("2017-03-15T10:47:47.647Z") 
     }, 
     "doctorId2":{ 
      "doctorJoined": ISODate("2017-04-15T10:47:47.647Z") 
     }, 
     "doctorId3":{ 
      "doctorJoined": ISODate("2017-05-15T10:47:47.647Z") 
     }, 
     ... 
     ... 
     //upto 30000-40000 more records suppose 
    } 
} 

答えて

1

私は私の理解あたりとして、この場合には、MongoDBのはロードされませんので、あなたが「を言うとき、あなたの理解が正しいとは思いません選択されたフィールドだけをメモリに保存しますか? "。

MongoDB Docと表示されている場合。読み取る場合

最大BSONドキュメントサイズは16メガバイトです。ドキュメントの最大サイズは、1つのドキュメントで過剰なRAMを使用できないようにするか、または送信中に過剰な帯域幅を使用するのに役立ちます。 MongoDBは、最大サイズを超える文書を格納するために、GridFS APIを提供します。

したがって、クリアサイズはドキュメントサイズで16 MBです。 Mongoはこのサイズよりも大きい文書を保存しないようにすべきです。

私はしばらくの間理解に同意すると、 は任意のサイズの文書を保存できますが、16 MBを超えるRAMは許可されていないとします。しかし一方で、データを格納している間、このデータで実行されるクエリはわかりません。最終的には、後で使用できない大きな文書を挿入することになります。 (なぜなら、挿入している間はクエリパターンを教えていないので、後で単一のショットで完全なドキュメントを取得しようとすることさえできます)。

制限が送信されている(仮想的に仮定した)場合、ソフトウェア開発者はクラスタ内のRAMにデータを持ち込むことができ、16 MBの制限を超えてデータを持ち出すことができます(コードで)大容量ファイルの場合)。彼らはこの限界を楽しんで、それを役に立たないままにします。私はMongoDBの作成者がそれを知っていて、それが起こりたくないと思っています。

制限が送信されている場合は、別途収集する必要はありません。すべてを単一のコレクションに入れ、スマートクエリを作成してデータを取得できます。フェッチされたデータが16 MBを超えている場合は、それを部分的にフェッチして制限を忘れてしまいます。しかし、それはこのようには行きません。

制限は文書サイズにする必要があります。そうしなければ、非常に多くの問題が発生する可能性があります。

私は、フィルタリングやクエリの目的で "doctorsWorking"データが必要なだけで、 "doctorsWorking"によってドキュメントが16 MBの制限を超えてしまうと思われる場合は、別のコレクションに保管することをお勧めします。

最終的にはすべてがクエリとデータパターンに依存します。医師が交替で複数の病院に勤務することができれば、医師を別々の集まりにしておくことは素晴らしいことです。

+0

お返事ありがとうございます。 '' 'db.Clinic.update({" _ id ":ObjectId(" 58e5e3ec54ccefdd4d85f638 ")}、{$ set:{"} "のようにドキュメント全体を読み込むのではなく、 doctorsWorking.doctor5 ":{ "doctorJoined":ISODate(" 2017-05-15T10:47:47.647Z」) }}} '' この方法を使用してのみ提供される特定のフィールドを更新する どうI。このメソッドを使用しても、または更新されているドキュメントの一部だけでも、完全なドキュメントをメモリにロードするかどうかを知りたい場合は https://docs.mongodb.com/manual/reference/operator/update/set/ –

+1

@RobinsGupta MongoDBは、ドキュメント全体が大きすぎることを知り、更新を停止します。 –

+0

@RobinsGupta 16 MB以上のドキュメントは許可されません。いずれかの更新、挿入、またはアップアップのいずれかによって。 –

関連する問題