Docs Menu
Docs Home
/
MongoDBマニュアル
/

BSON types

項目一覧

  • バイナリ データ
  • ObjectId
  • 文字列
  • タイムスタンプ
  • 日付

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"

フィールドの型を確認するには、「型チェック」を参照してください。

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 の値は長さ 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 の値は時間の経過とともに増加するはずですが、必ずしも単調ではありません。その理由は以下のとおりです。

    • 同じ場所からデータを取得できる間隔は 1 秒のみであるため、同一秒内に作成された ObjectId の順序は保証されません。

    • クライアントによって生成され、システムクロックが異なる可能性があります。

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 年以前の日付を表します。

mongoshnew Date() コンストラクタを使用して Date を構築します。

var mydate1 = new Date()

mongoshISODate() コンストラクタを使用して Date を構築します。

var mydate2 = ISODate()

Date 値を文字列として返す:

mydate1.toString()

Date 値の月の部分を返します。各月のインデックスは 0 なので、1 月は月 0 になります。

mydate1.getMonth()
[2] バージョン 2.0 以前では、Date 値は符号なし整数として誤って解釈されていたため、Date フィールドのソート、範囲クエリ、インデックスに影響を及ぼしていました。インデックスはアップグレード時に再作成されないため、以前のバージョンで Date 値にインデックスを作成し、かつ 1970 年より前の日付がアプリケーションに関連する場合は、インデックスを再度作成してください。

戻る

クエリ API