データ型
項目一覧
MongoDB は BSONを使用してデータを保存します。BSON はJSONでは利用できない追加のデータ型をサポートしています。 mongosh
shell は、レガシーのmongo
shell よりもドライバーのデータ型のサポートが優れています。
このドキュメントでは、mongosh
とレガシー mongo
shell における型の使用法の変更点について説明します。サポートされている型の詳細については、拡張 JSONリファレンスを参照してください。
日付
mongosh
には、日付を文字列または Date
オブジェクトとして返すさまざまなメソッドがあります。
Date()
メソッド(現在の日付を文字列として返す)。new Date()
ISODate()
ラッパーを使用してDate
オブジェクトを返すコンストラクター。ISODate()
ISODate()
ラッパーを使用してDate
オブジェクトを返すコンストラクター。
ObjectId
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() コンストラクタを使用して、明示的に double を指定できます。
db.types.insertOne( { "_id": 2, "value": Double(1), "expectedType": "Double" } )
注意
フィールドの値が 32 ビット整数に変換できる数値の場合、mongosh
では Int32
として保存します。変換できない場合、mongosh
では数値はデフォルトで Double
として保存されます。値の型を指定するには、Double()
または Int32()
コンストラクターを使用します。
Int32
Int32() コンストラクターを使用して 32 ビット整数を明示的に指定できます。
db.types.insertOne( { "_id": 1, "value": Int32(1), "expectedType": "Int32" } )
警告
mongosh
とレガシーの mongo
shell の両方を使用して同じコレクションに接続すると、デフォルトの Int32
型と Double
型が不整合な状態で保存される可能性があります。
Long
Long() コンストラクターを使用して 64 ビット整数を明示的に指定できます。
db.types.insertOne( { "_id": 3, "value": Long(1), "expectedType": "Long" } )
Decimal128
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 | 定義 |
---|---|---|---|
| integer | UNIXエポックから今までの時間。 | 任意。秒単位の時間。 |
| integer | 1 | 任意。特定の秒内に複数の操作がある場合の順序付けに使用されます。 |
使用例ついては、「新しいドキュメントのタイムスタンプ」、「カスタム タイムスタンプの作成」を参照してください。
型チェック
型を判別するには、$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
を返します。
Return Date
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": 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()
$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