BSON types
BSON は MongoDB でドキュメントを保存し、リモート プロシージャ コールを行うために使用されるバイナリ直列化形式です。BSON の仕様は bsonspec.org に掲載されています。
各 BSON 型の識別子には、下表に示すとおり整数と文字列の両方があります。
タイプ | 番号 | エイリアス | ノート |
---|---|---|---|
Double | 1 | "double" | |
文字列 | 2 | "string" | |
オブジェクト | 3 | "object" | |
配列 | 4 | "array" | |
バイナリ データ | 5 | "binData" | |
未定義 | 6 | "undefined" | 非推奨。 |
ObjectId | 7 | "objectId" | |
ブール値 | 8 | "bool" | |
日付 | 9 | "date" | |
null | 10 | "null" | |
正規表現 | 11 | "regex" | |
DBポインタ | 12 | "dbPointer" | 非推奨。 |
JavaScript | 13 | "javascript" | |
シンボル | 14 | "symbol" | 非推奨。 |
32 ビット整数 | 16 | "int" | |
タイムスタンプ | 17 | "timestamp" | |
64 ビット整数 | 18 | "long" | |
Decimal128 | 19 | "decimal" | |
Min key | -1 | "minKey" | |
Max key | 127 | "maxKey" |
$type
演算子は、これらの値を使用してフィールドを BSON types でクエリすることをサポートします。$type
は、整数、小数点、double 型、および長整数 BSON types に一致するnumber
エイリアスもサポートしています。$type
集計演算子は、引数の BSON 型を返します。$isNumber
集計演算子は、引数が BSON 整数、小数点、double 型、長整数型の場合、true
を返します。
フィールドの型を確認するには、「型チェック」を参照してください。
BSON を JSON に変換する場合は、拡張 JSONに関する参考資料を参照してください。
以下の各セクションでは、特定の BSON types に関する特別な考慮事項を取りあげています。
バイナリ データ
BSON バイナリbinData
値はバイト配列です。 binData
値には、バイナリ データの解釈方法を示すサブタイプがあります。 次の表にサブタイプを掲げます。
番号 | 説明 |
---|---|
0 | 汎用バイナリのサブタイプ |
1 | 関数データ |
2 | バイナリ(旧) |
3 | UUID(旧) |
4 | UUID |
5 | MD5 |
6 | 暗号化された BSON 値 |
7 | 圧縮された時系列データ バージョン 5.2 で追加。 |
8 | キーやシークレットなどの機密データ。 MongoDB では、サブタイプ 8 のバイナリ データのリテラル値はログに記録されません。代わりに、MongoDB は ### のプレースホルダー値をログに記録します。 |
9 | ベクトルデータとは、同じ型の数値が高密度に圧縮された配列です。 |
128 | カスタム データ |
ObjectId
ObjectId は小さく、ユニークである可能性が高く、生成が速く、順序付けられています。ObjectId の値は長さ 12 バイトで、次の要素で構成されます。
Unix エポックからの秒数で測定される ObjectId の作成を表す 4 バイトのタイムスタンプ。
プロセスごとに 1 回生成される 5 バイトのランダム値。このランダム値はマシンとプロセスに固有です。
ランダム値で初期化される 3 バイトのインクリメント カウンター。
タイムスタンプとカウンターの値では、最上位バイトがバイトシーケンスの最初に表示されます(ビッグエンディアン)。これは、再下位バイトが最初に表示される(リトルエンディアン)他の BSON 値との相違点です。
ObjectId の作成に整数値が使用される場合は、その整数がタイムスタンプに置き換わります。
MongoDB では、コレクション内に保存される各ドキュメントにはプライマリキーとして機能するユニークな _id フィールドが必要です。挿入されたドキュメントで _id
フィールドが省略されている場合、MongoDB ドライバーは _id
フィールドの ObjectId を自動的に生成します。
上記は、アップサート: true に設定した更新操作を通じて挿入されるドキュメントにも適用されます。
MongoDB クライアントは、ユニークな ObjectId を持つ _id
フィールドを追加します。_id
フィールドに ObjectId を使用すると、次のような追加のメリットが得られます。
ObjectId
メソッドを使用して、mongosh
ObjectId.getTimestamp()
の 作成時間にアクセスできます。ObjectId は作成時間順におおよそ順序付けられますが、完全には順序付けられません。
ObjectId
値を含む_id
フィールドでコレクションをソートすることは、作成時間でソートすることとほぼ同等です。
ObjectId 値を設定、取得するには、ObjectId()
メソッドを使用します。
MongoDB 5.0 以降、mongosh
は、レガシーの mongo
shell を置き換えます。ObjectId()
メソッドは、mongosh
とレガシー shell の mongo
では異なる動作をします。レガシー メソッドの詳細については、「レガシー mongo Shell」を参照してください。
文字列
BSON 文字列は UTF-8 です。通常、各プログラミング言語のドライバーは、BSON の直列化と逆直列化時に、言語の文字列形式を UTF-8 に変換します。これにより、ほとんどの国際文字は BSON 文字列形式で簡単に保存できるようになります。[1]さらに、MongoDB $regex
クエリは正規表現文字列形式の UTF-8 をサポートしています。
[1] | UTF-8 文字セットを使用する文字列の場合、文字列に sort() を使用するのが無難です。ただし、内部的な sort() では C++ strcmp API を使用するため、ソート順序で一部の文字が誤って処理される場合があります。 |
タイムスタンプ
BSON には MongoDB 内部で使用される、通常の Date 型とは関連付けられていない特殊なタイムスタンプ型があります。この内部タイムスタンプ型は 64 ビット値であり、次の属性を持ちます。
最上位の 32 ビットは
time_t
値(UNIX エポックからの秒数)です。最下位 32 ビットは、指定された秒内の操作に対して増加していく
ordinal
です。
BSON 形式はリトルエンディアンであるため最下位ビットを最初に保存しますが、mongod
インスタンスは エンディアン属性にかかわらず、すべてのプラットフォームで ordinal
値の前に time_t
値を常に比較します。
mongod
の単一インスタンス内では、タイムスタンプ値は常に一意です。
レプリケーション中、oplog には ts
フィールドが生成され、BSON タイムスタンプ値を使用する optime を反映した値がこのフィールドに入ります。
注意
BSON タイムスタンプ型は MongoDB 内部で使用するためのものです。アプリケーション開発では、BSON date 型を使用することがほとんどです。詳細については、「Date」を参照してください。
MongoDB では、最上位フィールドのタイムスタンプ値が空のドキュメントを挿入する際、空のタイムスタンプ値をその時点のタイムスタンプ値に置き換えます。ただし、例外として、_id
フィールド自体に空のタイムスタンプ値が含まれている場合は、常に空の値のまま挿入され、置き換えは行われません。
例
タイムスタンプ値が空のドキュメントを挿入します。
db.test.insertOne( { ts: new Timestamp() } );
db.test.find()
を実行すると、次のようなドキュメントが返されます。
{ "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }
サーバーは、ts
の空のスタンプ値を、挿入時のタイムスタンプ値に置き換えました。
日付
BSON Date は、UNIX エポック(1970 年 1 月 1 日)以降のミリ秒数を表す 64 ビットの整数であり、過去から未来にわたって約 2 億 9000 万年の日付範囲を表現可能にします。
正規の BSON 仕様は BSON Date 型を UTC datetime として参照します。
BSON Date 型は符号付き整数です。[2] 負の値は 1970 年以前の日付を表します。
例
mongosh
で new Date()
コンストラクタを使用して Date を構築します。
var mydate1 = new Date()
例
mongosh
で ISODate()
コンストラクタを使用して Date を構築します。
var mydate2 = ISODate()
例
Date 値を文字列として返す:
mydate1.toString()
例
Date 値の月の部分を返します。各月のインデックスは 0 なので、1 月は月 0
になります。
mydate1.getMonth()
[2] | バージョン 2.0 以前では、Date 値は符号なし整数として誤って解釈されていたため、Date フィールドのソート、範囲クエリ、インデックスに影響を及ぼしていました。インデックスはアップグレード時に再作成されないため、以前のバージョンで Date 値にインデックスを作成し、かつ 1970 年より前の日付がアプリケーションに関連する場合は、インデックスを再度作成してください。 |