AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

データ型

MongoDB は、 JSON では利用できない追加のデータ型をサポートする BSON を使用してデータを保存します。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

double() コンストラクターを使用して double を明示的に指定できます。

db.types.insertOne(
{
"_id": 2,
"value": Double(1),
"expectedType": "Double"
}
)

注意

フィールドの値が 32 ビット整数に変換できる数値の場合、mongosh では Int32 として保存します。変換できない場合、mongosh では数値はデフォルトで Double として保存されます。値の型を指定するには、Double() または Int32() コンストラクターを使用します。

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 なしで使用しても効果はありません。

注意

Timestamp() また、Timestamp(0, 0)の値は、通常のコレクションにおいてサーバーサイドのタイムスタンプを生成します。時系列コレクションでは、これらの値はタイムスタンプを生成しません。

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

型を判別するには、$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