ドキュメントは、MongoDB のデータの基本単位です。
MongoDB のオブジェクト指向データモデルにより、コードベースのオブジェクトモデルをミラーリングする方法でデータを構造化できます。これにより、関係データベースに必要なオブジェクト関係マッピングが不要になります。
注意
MongoDB はデータ レコードを BSON ドキュメントとして保存します。BSON は JSON ドキュメントのバイナリ表現ですが、JSON よりも多くのデータ型を含みます。BSON 仕様については、 bsonspec.org を参照してください。また、「BSON Types」もご参照ください。
ドキュメント構造
MongoDB ドキュメントはフィールドと値のペアで構成され、次の構造をしています。
{ field1: value1, field2: value2, field3: value3, ... fieldN: valueN }
フィールドの値は、他のドキュメント、配列、ドキュメントの配列など、任意の BSON データ型にすることができます。たとえば、次のドキュメントには多彩なタイプの値が含まれています。
var mydoc = { _id: ObjectId("5099803df3f4948bd2f98391"), name: { first: "Alan", last: "Turing" }, birth: new Date('Jun 23, 1912'), death: new Date('Jun 07, 1954'), contribs: [ "Turing machine", "Turing test", "Turingery" ], views : Long(1250000) }
上記のフィールドには、次のデータ型があります。
_id。ObjectId を保持します。name。firstとlastフィールドを含む埋め込みドキュメントを保持します。birthとdeath。Date 型の値を保持します。contribs文字列の配列を保持します。views。NumberLong 型の値を保持します。
フィールド名
フィールド名は文字列です。
ドキュメントにはフィールド名に関して次の制限があります。
- The field name
_idis reserved for use as a primary key; its value must be unique in the collection, is immutable, and may be of any type other than an array or regex._idにサブフィールドが含まれている場合、サブフィールド名は($)記号で始めることができません。
フィールド名に
null文字を含めることはできません。サーバーでは、ドット(
.)とドル記号($)を含むフィールド名を保存できます。MongodB 5.0 では、フィールド名における(
$)および(.)の使用に対するサポートが強化されました。制限事項がいくつかあります。詳細については、フィールド名の考慮事項を参照してください。
MongoDBクエリ言語はフィールド名が重複するドキュメントをサポートしていません。
BSONビルダによっては、重複するフィールド名を持つBSONドキュメントの作成をサポートしている場合がありますが、これらのドキュメントをMongoDBに挿入した場合、挿入が 成功したように見えても サポートされていません。
例、 MongoDBドライバーを使用して重複しているフィールド名を持つBSONドキュメントを挿入すると、挿入前にドライバーが勝手に重複値を削除したり、重複フィールドを含む無効なドキュメントが挿入されたりする可能性があります。 これらのドキュメントをクエリすると、結果が不整合になります。
アップデートが 成功したように見えても 、重複するフィールド名を持つドキュメントのアップデートはサポートされていません。
MongoDB6.1 以降、ドキュメントに重複するフィールド名があるかどうかを確認するには、validate fullフィールドを に設定してtrue コマンドを使用します。いずれのMongoDBバージョンでも、ドキュメントに重複するフィールド名があるかどうかを確認するには、$objectToArray 集計子を使用します。
ドット表記
MongoDB は、ドット表記を使用して配列の要素と埋め込みドキュメントのフィールドにアクセスします。
配列
ゼロベースのインデックス位置で配列要素を指定したりアクセスしたりするには、配列名をドット(.)とゼロベースのインデックス位置と連結し、引用符で囲みます。
"<array>.<index>"
たとえば、ドキュメントに次のフィールドがあるとします。
{ ... contribs: [ "Turing machine", "Turing test", "Turingery" ], ... }
contribs 配列の 3 つ目の要素を指定するには、ドット表記「"contribs.2"」を使用します。
配列のクエリの例については、次のトピックを参照してください。
注意
位置演算子
更新操作中に、
$[]のすべての位置演算子は、指定された配列フィールド内のすべての要素を更新します。$[<identifier>]フィルターされた位置演算子は、arrayFilters で指定された条件に一致するすべての配列要素を更新します。$位置演算子は、インデックスを指定する必要なく、クエリ条件に一致する最初の配列要素を更新します。$プロジェクション演算子は、読み取り操作でクエリ条件に一致する最初の配列要素を返します。配列を使用したドット表記の例には、ゼロベースの配列インデックス位置によるクエリを含め、「配列のクエリ」を参照してください。
埋め込みドキュメント
ドット表記で埋め込みドキュメントのフィールドを指定またはアクセスするには、埋め込みドキュメント名をドット(.)とフィールド名と連結し、引用符で囲みます。
"<embedded document>.<field>"
たとえば、ドキュメントに次のフィールドがあるとします。
{ ... name: { first: "Alan", last: "Turing" }, contact: { phone: { type: "cell", number: "111-222-3333" } }, ... }
nameフィールドにlastという名前のフィールドを指定するには、ドット表記"name.last"を使用します。phoneドキュメントのnumberをcontactフィールドに指定するには、ドット表記"contact.phone.number"を使用します。
警告
パーティション フィールドでは、ドット(.)を含むフィールド名は使用できません。
埋め込みドキュメントをクエリする例については、以下を参照してください。
ドキュメントの制限
ドキュメントには次の属性があります。
ドキュメント サイズの制限
BSONドキュメントの最大サイズは 16 メガバイトです。
The maximum document size helps ensure that a single document cannot use an excessive amount of RAM or, during transmission, an excessive amount of bandwidth. To store documents larger than the maximum size, MongoDB provides the GridFS API. For more information about GridFS, see mongofiles and the documentation for your driver.
ドキュメント フィールドの順序
JavaScript オブジェクトと違い、BSON ドキュメント内のフィールドには順序が指定されています。
クエリ内のフィールドの順序
クエリの場合、フィールドの順序に関する動作は次のようになります。
ドキュメントを比較する場合、フィールドの順序は重要です。たとえば、クエリ内でフィールド
aのあるドキュメントとフィールドbのあるドキュメントを比較する場合、次のようになります。{a: 1, b: 1}は次と等しい:{a: 1, b: 1}{a: 1, b: 1}は次と等しくない:{b: 1, a: 1}
クエリエンジンはクエリを効率的に実行するために、クエリ処理中にフィールドの順序を再配置する場合があります。フィールド順序が変わる別のケースとして、次のプロジェクション演算子を処理する場合が挙げられます。
$project、$addFields、$set、$unset。フィールド順序は、クエリによって返される中間的な結果と最終的な結果の両方で変更される可能性があります。
一部の操作ではフィールドの順序が再配置される場合があるため、以前にリストされたプロジェクション演算子を使用したクエリで返される結果のフィールド順序に依存しないでください。
書き込み操作におけるフィールド順序
MongoDB は次のケースを除き、書込み操作でドキュメントのフィールド順序を維持します。
_idフィールドは常にドキュメントの最初のフィールドとなります。更新にフィールド名
renamingが含まれる場合、ドキュメント内のフィールド順序が変更されることがあります。
_id フィールド
MongoDBでは、標準コレクション内に保存される各ドキュメントには プライマリキーとして機能する一意の _idフィールドが必要です。_id挿入されたドキュメントで フィールドが省略されている場合、 MongoDBドライバーは _idフィールドの ObjectId を自動的に生成します。
上記は、アップサート: true に設定した更新操作を通じて挿入されるドキュメントにも適用されます。
注意
時系列コレクション では、 MongoDB は フィールドにインデックスを作成しないため、ドキュメントには一意の _idフィールドは必要ありません。_id
_id フィールドの動作と制約は次のとおりです。
デフォルトでは、MongoDB はコレクションの作成時に
_idフィールドにユニークインデックスを作成します。_idフィールドは常にドキュメントの最初のフィールドとなります。サーバーは、_idフィールドが先頭にないドキュメントを受信した場合、そのフィールドを先頭に移動します。_idにサブフィールドが含まれている場合、サブフィールド名は($)記号で始めることができません。_idフィールドには、配列、正規表現、または未定義のデータ型以外に、任意の BSON データ型の値を含めることができます。警告
レプリケーションが正常に機能するように、
_idフィールドに BSON 正規表現型の値は保存しないでください。
以下は、_id の値を保存するための一般的なオプションです。
ObjectId を使用します。
自然な一意識別子がある場合は、それを使用すると、スペースが節約され、追加のインデックスが不要になります。
自動インクリメント番号を生成します。
アプリケーション コードで UUID を生成します。コレクションと
_idインデックス内の UUID 値をより効率的に保存するには、BSONBinData型の値として UUID を保存します。BinData型のインデックス キーは、次の場合、より効率的にインデックスに保存されます。バイナリ サブタイプ値が 0〜7 または 128〜135 の範囲にあり、かつ
バイト配列の長さが 0、1、2、3、4、5、6、7、8、10、12、14、16、20、24、または 32 である。
ドライバーの BSON UUID 機能を使用して UUID を生成します。ドライバーを実装する際、UUID の直列化および逆直列化のロジックが異なる場合があり、他のドライバーと完全には互換しない可能性があることに注意してください。UUID の相互運用性に関する詳細については、ドライバーのドキュメントを参照してください。
注意
ほとんどの MongoDB ドライバーは_idフィールドを含み、MongoDB に挿入操作を送信する前にObjectIdを生成します。 ただし、クライアントが_idフィールドなしでドキュメントを送信した場合、 mongodは_idフィールドを追加し、 ObjectIdを生成します。