警告
次のドキュメントは、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ずつ増加させます。これをmongoshell は を浮動小数として扱います。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" } } )
シェルでの型の確認mongoshell
フィールド型を決定するために、 shellmongo はinstanceof 演算子とtypeof 演算子を提供します。
instanceof
instanceof 値が何らかの型のインスタンスであるかどうかをテストするためのブール値を返します。
たとえば、次の操作は、 _idフィールドがタイプObjectIdのインスタンスであるかどうかをテストします。
mydoc._id instanceof ObjectId
この操作では、true を返します。
typeof
typeof は、フィールドの型を返します。
たとえば、次の操作は_idフィールドのタイプを返します。
typeof mydoc._id
この場合、 typeofはObjectId型ではなく、より一般的なobject型を返します。