警告
次のドキュメントは、mongo
MongoDB Server のダウンロード に含まれる シェルに関連しています。新しいMongoDB Shell(mongosh
)の詳細については、 mongoshドキュメント を参照してください。
2 つの shell の違いを理解するには、「 mongo
Shell とmongosh
の比較 」を参照してください。
MongoDB BSONはJSONよりも追加のデータ型をサポートします。 ドライバーはホスト言語でこれらのデータ型のネイティブ サポートを提供します。また、 mongo
shell は、 mongo
JavaScript shell でこれらのデータ型の使用をサポートするためのいくつかのヘルパー クラスを提供します。 詳細については、拡張 JSONリファレンスを参照してください。
タイプ
日付
mongo
shell には、日付を string またはDate
オブジェクトとして返すさまざまなメソッドが用意されています。
Date()
メソッド(現在の日付を文字列として返す)。new Date()
ISODate()
ラッパーを使用してDate
オブジェクトを返すコンストラクター。ISODate()
ISODate()
ラッパーを使用してDate
オブジェクトを返すコンストラクター。
内部的には、 Date オブジェクトは、UNIX エポック(1970 年 1 月 1 日)からのミリ秒数を表す符号付き 64 ビット整数として保存されます。
すべてのデータベース操作とドライバーが64 ビット範囲全体をサポートしているわけではありません。年が 0
から 9999
まで(両端を含める)の範囲内にある日付であれば安全に処理できます。
日付を文字列として返す
日付を文字列として返すには、次の例のようにDate()
メソッドを使用します。
var myDateString = Date();
変数の値を印刷するには、次のように shell に変数名を入力します。
myDateString
結果は myDateString
の値です。
Wed Dec 19 2012 01:03:25 GMT-0500 (EST)
型を確認するには、次のようにtypeof
演算子を使用します。
typeof myDateString
この操作では、string
を返します。
Return Date
mongo
shell は、 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")
型を確認するには、次のようにinstanceof
演算子を使用します。
myDate instanceof Date myDateInitUsingISODateWrapper instanceof Date
この操作では両方のtrue
が返されます。
ObjectId
mongo
shell はObjectIdデータ型を囲むObjectId()
ラッパー クラスを提供します。 新しい ObjectId を生成するには、 mongo
shell で次の操作を使用します。
new ObjectId
NumberLong
mongo
shell は、デフォルトですべての数値を浮動小数点値として扱います。 mongo
shell は、 64ビット整数を処理するためのNumberLong()
ラッパーを提供します。
NumberLong()
ラッパーは、long を string として受け入れます。
NumberLong("2090845886852")
次の例では、 NumberLong()
ラッパーを使用して コレクションに書き込みます。
db.collection.insertOne( { _id: 10, calc: NumberLong("2090845886852") } ) db.collection.updateOne( { _id: 10 }, { $set: { calc: NumberLong("2555555000000") } } ) db.collection.updateOne( { _id: 10 }, { $inc: { calc: NumberLong("5") } } )
以下のことを確認するには、ドキュメントを取得してください。
db.collection.findOne( { _id: 10 } )
返されたドキュメントでは、 calc
フィールドにNumberLong
オブジェクトが含まれています。
{ "_id" : 10, "calc" : NumberLong("2555555000005") }
$inc
を使用してNumberLong
オブジェクトを含むフィールドの値を浮動小数点数によって増加させると、データ型は次の例のように浮動小数点値に変わります。
$inc
を使用してcalc
フィールドを5
ずつ増加させます。これをmongo
shell は を浮動小数として扱います。db.collection.updateOne( { _id: 10 }, { $inc: { calc: 5 } } ) Retrieve the updated document:
db.collection.findOne( { _id: 10 } ) 更新されたドキュメントの
calc
フィールドには浮動小数点値が含まれています。{ "_id" : 10, "calc" : 2555555000010 }
注意
NumberLong()
コンストラクターはmongo
shell からのinteger
値を受け入れますが(つまり 引用符なしで)、これは推奨されません。 JavaScript の定義されたNumber.MAX_SAFE_INTEGER
(数値2^53 - 1
)よりも大きい整数値を指定すると、予期しない動作が発生する可能性があります。
NumberInt
mongo
shell は、デフォルトですべての数値を浮動小数点値として扱います。 mongo
shell は、 32ビット整数を明示的に指定するためのNumberInt()
コンストラクターを提供します。
NumberDecimal
バージョン 3.4 で追加。
mongo
shell は、デフォルトですべての数値を64ビット浮動小数点double
値として扱います。 mongo
shell は、正確な精度で小数の丸めをエミュレートできる128ビットの 10 進数ベースの浮動小数点値を明示的に指定するためのNumberDecimal()
コンストラクターを提供します。 この機能は、財務、税金、科学的な計算など、金銭データを取り扱うアプリケーションを対象としています。
decimal
BSON タイプは、IEEE で規定される754 10進数128浮動小数点数形式を使用し、 34桁の 10 進数( 有効桁数)および − 6143から + 6144の指数範囲をサポートしています。
NumberDecimal()
コンストラクターは、 decimal
値を string として受け入れます。
NumberDecimal("1000.55")
値は、 データベースに次のように保存されます。
NumberDecimal("1000.55")
NumberDecimal()
コンストラクターは、 mongo
shell からのdouble
値も受け入れます(つまり )、精度が失われるリスクがあるため推奨されません。 コンストラクターは、10 進数ベースの パラメータのバイナリベースのdouble
精度表現(精度が失われる可能性あり)を作成し、その値を15桁の精度を持つdecimal
値に変換します。 次の例では、値を暗黙的にdouble
として渡し、それが15桁の精度で作成される方法を示しています。
NumberDecimal(1000.55)
値は、 データベースに次のように保存されます。
NumberDecimal("1000.55000000000")
次の例えでは値を暗黙的にdouble
として渡し、精度の低下がどのように発生する可能性があるかを示しています。
NumberDecimal(9999999.4999999999)
値は、 データベースに次のように保存されます。
NumberDecimal("9999999.50000000")
注意
MongoDB ドライバーで decimal
データ型を使用するには、このデータ型に対応しているドライバー バージョンを必ず使用してください。
等価性とソート順
decimal
型の値は実際の数値に基づいて他の数値型と比較され、並べ替えられます。 バイナリベースのdouble
型の数値は、通常 10 進数ベースの値のおおよその表現であり、 decimal
表現と正確に一致しない場合があるため、 decimal
値の等価性をチェックする場合はNumberDecimal()
コンストラクターを使用します。 numbers
コレクションに次のドキュメントがある次の例を考えてみましょう。
{ "_id" : 1, "val" : NumberDecimal( "9.99" ), "description" : "Decimal" } { "_id" : 2, "val" : 9.99, "description" : "Double" } { "_id" : 3, "val" : 10, "description" : "Double" } { "_id" : 4, "val" : NumberLong("10"), "description" : "Long" } { "_id" : 5, "val" : NumberDecimal( "10.0" ), "description" : "Decimal" }
以下の表のクエリがdb.numbers.find(<query>)
メソッドにプラグインされると、次の結果が返されます。
クエリ | 結果 |
---|---|
{ "val": 9.99 } | {" _id ": 2, "val": 9.99, "description": " double " } |
{ "val": NumberDecimal( " 9.99 " ) } | { "_id": 1 , "val": NumberDecimal( " 9.99 " )、"description": "Decimal" } |
{ val: 10 } | { "_id": 3, "val": 10, "description": "Double" } { "_id": 4, "val": NumberLong(10), "description": "Long" } { "_id": 5, "val": NumberDecimal( "10.0" ), "description": "Decimal" } |
{ val: NumberDecimal( " 10 " ) } | { "_id": 3, "val": 10, "description": "Double" } { "_id": 4, "val": NumberLong(10), "description": "Long" } { "_id": 5, "val": NumberDecimal( "10.0" ), "description": "Decimal" } |
最初のクエリ{ "val": 9.99 }
は、値のdecimal
表現と等しくない9.99
のdouble
表現を暗黙的に検索します。
NumberDecimal()
コンストラクターは、 9.99
のdecimal
表現を持つドキュメントをクエリするために使用されます。 double
型の値は、 9.99
のdecimal
表現の正確な値と一致しないため除外されます。
整数をクエリすると、すべての数値型に一致する値が返されます。 たとえば、 10
のdouble
表現をクエリすると、結果には10.0
のdecimal
表現が含まれ、その逆も同様です。
タイプの確認decimal
decimal
型をテストするには、string エイリアス"decimal"
または19
とともに$type
演算子を使用し、 decimal
型の数値コードを使用します。
db.inventory.find( { price: { $type: "decimal" } } )
シェルでの型の確認mongo
shell
フィールド型を決定するために、 shellmongo
はinstanceof
演算子とtypeof
演算子を提供します。
instanceof
instanceof
値が何らかの型のインスタンスであるかどうかをテストするためのブール値を返します。
たとえば、次の操作は、 _id
フィールドがタイプObjectId
のインスタンスであるかどうかをテストします。
mydoc._id instanceof ObjectId
この操作では、true
を返します。
typeof
typeof
は、フィールドの型を返します。
たとえば、次の操作は_id
フィールドのタイプを返します。
typeof mydoc._id
この場合、 typeof
はObjectId
型ではなく、より一般的なobject
型を返します。