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
Tip
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 を返します。
日付を返す
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