Docs Menu
Docs Home
/
MongoDB Shell
/

データ型

項目一覧

  • 日付
  • ObjectId
  • Int32
  • Long
  • Decimal128
  • 等価性とソート順
  • タイムスタンプ
  • 型チェック
  • 日付を文字列として返す
  • Return Date
  • 数値タイプ
  • デフォルトの数値型の整合性
  • 新しいドキュメントのタイムスタンプ
  • カスタム タイムスタンプの作成
  • 次のコマンドで型チェックします: $type()
  • コンストラクタによる型チェック

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

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

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

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

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

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

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

new ObjectId

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

  • ObjectId.prototype.generate

  • ObjectId.prototype.getInc

  • ObjectId.prototype.get_inc

  • ObjectId.getInc

Tip

以下も参照してください。

数値を 32 ビット整数に変換できる場合、mongosh では Int32 として保存されます。変換できない場合、mongosh では数値はデフォルトで Double として保存されます。mongoshInt32 として格納されている数値は、mongo shell ではデフォルトで Double として保存されます。

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
任意。特定の秒内に複数の操作がある場合の順序付けに使用されます。it なしで使用しても効果はありません。

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

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

Javascript の typeof 演算子は、より具体的な Int32ObjectId ではなく、numberobject などの一般的な値を返します。

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()ヘルパーでラップされたmyDateDate 値です。

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.01Double 表現を暗黙的に検索します。ドキュメント _id: 4Decimal128 なので選択されません。

ただし、{ "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

戻る

レガシーとの互換性の変更