Docs Menu
Docs Home
/
データベース マニュアル
/

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"

非推奨。

JavaScript (スコープ付き)

15

"javascriptWithScop"

非推奨。

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 バイトのタイムスタンプ。

  • クライアント側のプロセスごとに一度だけ生成される 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 値を常に比較します。

レプリケーション中、oplog には ts フィールドが生成され、BSON タイムスタンプ値を使用する optime を反映した値がこのフィールドに入ります。

単一のmongodインスタンス内では、oplog内のタイムスタンプ値は常に一意です。

注意

BSON タイムスタンプ型は MongoDB 内部で使用するためのものです。アプリケーション開発では、BSON date 型を使用することがほとんどです。詳細については、「Date」を参照してください。

BSON Date は、UNIX エポック(1970 年 1 月 1 日)以降のミリ秒数を表す 64 ビットの整数であり、過去から未来にわたって約 2 億 9000 万年の日付範囲を表現可能にします。

正規の BSON 仕様は BSON Date 型を UTC datetime として参照します。

BSON Date 型は符号付き整数です。[2] 負の値は 1970 年以前の日付を表します。

mongoshDate を構築するには、new Date() またはISODate() コンストラクターを使用できます。

new Date() コンストラクターを使用してDate を構築するには、次のコマンドを実行します。

var mydate1 = new Date()

mydate1 変数は、ISODate としてラップされた日付と時刻を出力します。

mydate1
ISODate("2020-05-11T20:14:14.796Z")

ISODate() コンストラクターを使用してDate を構築するには、次のコマンドを実行します。

var mydate2 = ISODate()

mydate2 変数は、ISODate としてラップされた日付と時刻を格納します。

mydate2
ISODate("2020-05-11T20:14:14.796Z")

Datestring 形式で表示するには、toString() メソッドを使用します。

mydate1.toString()
Mon May 11 2020 13:14:14 GMT-0700 (Pacific Daylight Time)

Date の値の月部分を返すこともできます。月にはゼロから始まるインデックスが付けられているため、1月は0 です。

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

decimal128 128 ビットの10進数表現は、非常に大きな数値や非常に精密な数値を格納する際に、四捨五入が重要な場合に使用されます。これは 2009 年 8 月に IEEE 754-2008 の浮動小数点改訂の一環として作成されました。BSON データ型を扱う際に高精度が必要な場合は、decimal128 を使用する必要があります。

decimal128 34 桁の精度の10進数または有効桁数をサポートし、指数範囲は -6143 から +6144 です。decimal128 標準では仮数は正規化されないため、 10 x 10^-1 = 1 x 10^0 = .1 x 10^1 = .01 x 10^2 など複数の表現が可能です。最大値と最小値をそれぞれ 10^614410^-6143 の順序で保存する能力があるため、多くの精度が可能になります。

MongoDB では、Decimal128() コンストラクターを使用して decimal128 形式でデータを保存できます。10進数の値を文字列として渡すと、MongoDB はその値を次のようにデータベースに保存します。

Decimal128("9823.1297")

小数値を double として渡すこともできます。

Decimal128.fromStringWithRounding("1234.99999999999")

また、プログラミング言語の decimal128 の使用状況とサポートも考慮する必要があります。次の言語はこの機能をネイティブでサポートしておらず、機能を取得するにはプラグインまたは追加のパッケージが必要です。

プログラムで数学計算を実行すると、予期しない結果が生じることがあります。次の Node.js の例では、誤った結果が得られます。

> 0.1
0.1
> 0.2
0.2
> 0.1 * 0.2
0.020000000000000004
> 0.1 + 0.1
0.010000000000000002

同様に、Java の以下の例では誤った出力が生成されます。

1class Main {
2 public static void main(String[] args) {
3 System.out.println("0.1 * 0.2:");
4 System.out.println(0.1 * 0.2);
5 }
6}
10.1 * 0.2:
20.020000000000000004

Python、Ruby、Rust、その他の言語で同じ計算を行うと、同じ結果が生じます。これは、バイナリ浮動小数点数が基数 10 の値をうまく表現できないために起こります。

例えば、上記の例で使用されている 0.1 は、バイナリで 0.0001100110011001101 として表されます。ほとんどの場合、これによって重大な問題が発生することはありません。ただし、金融や銀行のように精度が重要なアプリケーションでは、データ型として decimal128 を使用してください。

戻る

クエリ API

項目一覧