AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

データ型

MongoDB は、 JSON では利用できない追加のデータ型をサポートする BSON を使用してデータを保存します。mongosh shell は、レガシーのmongo shell よりもドライバーのデータ型のサポートが優れています。

このドキュメントでは、mongosh とレガシー mongo shell における型の使用法の変更点について説明します。サポートされている型の詳細については、拡張 JSONリファレンスを参照してください。

mongosh には、日付を文字列または Date オブジェクトとして返すさまざまなメソッドがあります。

  • Date() メソッド(現在の日付を文字列として返す)。

  • new Date() ISODate() ラッパーを使用して Date オブジェクトを返すコンストラクター。

  • ISODate() ISODate() ラッパーを使用して Date オブジェクトを返すコンストラクター。

mongosh は ObjectId データ型を囲む ObjectId() ラッパー クラスを提供します。新しい ObjectId を生成するには、mongosh で以下の操作を使用します。

new ObjectId

1.8.0 以降、ObjectId ラッパーは次のものを受け入れなくなりました。

  • ObjectId.prototype.generate

  • ObjectId.prototype.getInc

  • ObjectId.prototype.get_inc

  • ObjectId.getInc

double() コンストラクターを使用して double を明示的に指定できます。

db.types.insertOne( { "_id": 2, "value": Double(1), "expectedType": "Double" })

注意

フィールドの値が 32 ビット整数に変換できる数値の場合、mongosh では Int32 として保存します。変換できない場合、mongosh では数値はデフォルトで Double として保存されます。値の型を指定するには、Double() または Int32() コンストラクターを使用します。

Int32() コンストラクターを使用して 32 ビット整数を明示的に指定できます。

db.types.insertOne( { "_id": 1, "value": Int32(1), "expectedType": "Int32" })

警告

mongosh とレガシーの mongo shell の両方を使用して同じコレクションに接続すると、デフォルトの Int32 型と Double 型が不整合な状態で保存される可能性があります。

Long() コンストラクターを使用して 64 ビット整数を明示的に指定できます。

db.types.insertOne( { "_id": 3, "value": Long(1), "expectedType": "Long" })

注意

レガシー mongo shellでは、NumberLong() で文字列または整数値のいずれかを使用できました。mongosh では、NumberLong() で使用できる値が文字列のみになります。Long() は、64 ビットの値への変換や 64 ビットの値からの変更を管理するメソッドを提供します。

Decimal128() の値は、正確な精度で小数の丸めをエミュレートする 128 ビットの 10 進数ベースの浮動小数点数です。

この機能は、財務、税金、科学的な計算など、金銭データを取り扱うアプリケーションを対象としています。

Decimal128 BSON 型は、IEEE 754 で規定される 128 ビットの 10進数形式の浮動小数点数を使用し、34 桁の 10 進数(有効桁数)および −6143 から +6144 までの指数範囲をサポートしています。

db.types.insertOne( { "_id": 5, "value": Decimal128("1"), "expectedType": "Decimal128" })

注意

MongoDB ドライバーで Decimal128 データ型を使用するには、このデータ型に対応しているドライバー バージョンを必ず使用してください。

Decimal128 型の値は実際の数値に基づいて他の数値型と比較され、並べ替えられます。バイナリベースの Double 型の数値は、通常 10 進数ベースの値のおおよその表現であり、10 進数表現と正確に一致しない場合があります。

MongoDB は oplog で内部的に BSON タイムスタンプを使用します。Timestamp 型は Java の Timestamp 型と同様に機能します。日付に関連する操作には、Date 型を使用します。

Timestamp 署名には2つの任意のパラメーターがあります。

Timestamp( { "t": <integer>, "i": <integer> } )
Parameter
タイプ
default
定義

t

integer

UNIXエポックから今までの時間。

任意。秒単位の時間。

i

integer

1

任意。特定の秒内に複数の操作がある場合の順序付けに使用されます。i を t なしで使用しても効果はありません。

注意

Timestamp() また、Timestamp(0, 0)の値は、通常のコレクションにおいてサーバーサイドのタイムスタンプを生成します。時系列コレクションでは、これらの値はタイムスタンプを生成しません。

使用例ついては、「新しいドキュメントのタイムスタンプ」、「カスタム タイムスタンプの作成」を参照してください。

型を判別するには、$type クエリ演算子を使用するか、オブジェクト コンストラクターを確認します。

Javascript の typeof 演算子は、より具体的な Int32 や ObjectId ではなく、number や object などの一般的な値を返します。

Javascript の instanceof 演算子は信頼できません。たとえば、instanceof は、サーバー応答内の BSON 値を、ユーザーが指定した値とは異なる基本クラスに割り当てます。

使用例については、$type() による型の確認 および コンストラクターによる型の確認 を参照してください。

日付を文字列として返すには、次の例のようにDate() メソッドを使用します。

var myDateString = Date();

変数の値を印刷するには、次のように shell に変数名を入力します。

myDateString

結果は myDateString の値です。

Wed Dec 19 2012 01:03:25 GMT-0500 (EST)

型を確認するには、次のようにtypeof 演算子を使用します。

typeof myDateString

この操作では、string を返します。

mongosh は、Date 型のオブジェクトを ISODate ヘルパーでラップします。ただし、オブジェクトは Date 型のままです。

次の例では、 new Date() コンストラクターと ISODate() コンストラクターの両方を使用して、 Date オブジェクトを返します。

var myDate = new Date();var myDateInitUsingISODateWrapper = ISODate();

new 演算子は ISODate() コンストラクターでも使用できます。

変数の値を印刷するには、次のように shell に変数名を入力します。

myDate

結果は ISODate()ヘルパーでラップされたmyDate の Date 値です。

ISODate("2012-12-19T06:01:17.171Z")

型を確認するには、次のようにします。

var myDate = ISODate("2021-03-21T06:00:00.171Z")Object.prototype.toString.call(myDate) === "[object Date]"

この操作では、true を返します。

types コレクションを考慮します。

{ _id: 1, value: 1, expectedType: 'Int32' },{ _id: 2, value: Long("1"), expectedType: 'Long' },{ _id: 3, value: 1.01, expectedType: 'Double' },{ _id: 4, value: Decimal128("1.01"), expectedType: 'Decimal128' },{ _id: 5, value: 3200000001, expectedType: 'Double' }

この表では、対応する <QUERY> に対する db.types.find( <QUERY> ) コマンドの結果を示しています。タイプ名とエイリアスは [BSON types] ページに記載されています。

クエリ
結果
{ "value": { $type: "int" }}
{ _id: 1, value: 1, expectedType: 'Int32'}
{ "value": { $type: "long" }}
{ _id: 2, value: Long("1"), expectedType: 'Long'}
{ "value": { $type: "decimal" }}
{ _id: 4, value: Decimal128("1"), expectedType: 'Decimal128'}
{ "value": { $type: "double" }}
{ _id: 3, value: 1.01, expectedType: 'Double'}{ _id: 5, value: 3200000001, expectedType: 'Double'}
{ "value": { $type: "number" }}
{ _id: 1, value: 1, expectedType: 'Int32'}{ _id: 2, value: Long("1"), expectedType: 'Long'}{ _id: 3, value: 1.01, expectedType: 'Double'}{ _id: 4, value: Decimal128("1.01"), expectedType: 'Decimal128'}{ _id: 5, value: 3200000001, expectedType: 'Double'}
{ "value": 1.01}
{ _id: 3, value: 1.01, expectedType: 'Double'}
{ "value": 1}
{ _id: 1, value: 1, expectedType: 'Int32'}{ _id: 2, value: Long("1"), expectedType: 'Long'}

クエリ { "value": 1.01 } は、1.01 の Double 表現を暗黙的に検索します。ドキュメント _id: 4 は Decimal128 なので選択されません。

ただし、{ "value": 1 } が Int32 型と Long 型の両方を返すことに注意してください。

typeExampleコレクションについて考えてみましょう。このコレクションは、2 つの同一のドキュメント{ "a": 1 }で構成されています。最初のドキュメントはレガシーの mongo shell で作成され、2 番目のドキュメントは mongosh で作成されました。

集計パイプラインで $type 演算子を使用すると、各 shell で割り当てられた型を確認できます。

db.typeExample.aggregate( [ { $project: { "valueType": { "$type": "$a" }, "_id": 0 } } ])

レガシーの mongo shell で作成された最初のドキュメントでは、値は double として保存されていました。mongosh ドキュメントでは、値は int 型として保存されました。

[ { valueType: 'double' // inserted in legacy mongo shell }, { valueType: 'int' // inserted in mongosh }]

デフォルト設定を使用して複数のドキュメントを挿入するには、パラメーターなしで Timestamp() を使用します。

db.flights.insertMany( [ { arrival: "true", ts: Timestamp() }, { arrival: "true", ts: Timestamp() }, { arrival: "true", ts: Timestamp() } ])

タイムスタンプを確認するには、db.flights.find({}) を実行します。3 つのエントリすべてが同じ秒にスタンプされていても、間隔はそれぞれ 1 つずつ増加していることに注意してください。

[ { _id: ObjectId("6114216907d84f5370391919"), arrival: 'true', ts: Timestamp({ t: 1628709225, i: 1 }) }, { _id: ObjectId("6114216907d84f537039191a"), arrival: 'true', ts: Timestamp({ t: 1628709225, i: 2 }) }, { _id: ObjectId("6114216907d84f537039191b"), arrival: 'true', ts: Timestamp({ t: 1628709225, i: 3 }) }]

特定の Timestamp を持つ複数のドキュメントを挿入するには、カスタム パラメーターを使用します。

この操作では、3 つのドキュメントを flights コレクションに挿入し、UNIXエポック値 1627811580 を使用して、ts 時刻を 2021 年 8 月 1 日の 9:53 GMT に設定します。

db.flights.insertMany( [ { arrival: "true", ts: Timestamp(1627811580, 10) }, { arrival: "true", ts: Timestamp(1627811580, 20) }, { arrival: "true", ts: Timestamp(1627811580, 30) } ])

結果のドキュメントは次のようになります。

[ { _id: ObjectId("6123d8315e6bba6f61a1031c"), arrival: 'true', ts: Timestamp({ t: 1627811580, i: 10 }) }, { _id: ObjectId("6123d8315e6bba6f61a1031d"), arrival: 'true', ts: Timestamp({ t: 1627811580, i: 20 }) }, { _id: ObjectId("6123d8315e6bba6f61a1031e"), arrival: 'true', ts: Timestamp({ t: 1627811580, i: 30 }) }]

$type クエリ演算子は、データ型に対応する文字列エイリアスまたは数値コードのいずれかを受け入れます。BSON データ型とそれに対応する数値コードのリストについては、「BSON Types」を参照してください。

たとえば、Decimal128 型に対する以下のチェックは同等です。

db.types.find( { "value": { $type: "decimal" } } )db.types.find( { "value": { $type: 19 } } )

オブジェクト constructor を確認して型を判断します。たとえば、db.collection.find() の出力は Cursor です。

var findResults = db.housing.find({"multiUnit": true} )findResults.constructor.name // Returns the type