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

データ型

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

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

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

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

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

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

mongosh ObjectId()は 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() コンストラクターを使用します。

32Int() コンストラクターを使用して、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レガシーNumberLong() mongoshシェルでは、 は文字列または整数値のいずれかを使用できました。 では、 はNumberLong() string 値のみを受け入れます。 Long() は、64 ビットの値への変換や 64 ビットの値からの変更を管理するメソッドを提供します。

Decimal()128 の値は、正確な精度で小数の丸めをエミュレートする128 ビットの 10 進数ベースの浮動小数点数であり、

この機能は、財務、税金、科学的な計算など、金銭データを取り扱うアプリケーションを対象としています。

BSONタイプ は、IEEE で規定されるDecimal128754 decimal128 浮動小数点数形式を使用し、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

任意。特定の秒内に複数の操作がある場合の順序付けに使用されます。i を t なしで使用しても効果はありません。

注意

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

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

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

ただし、{ "value": 1 } が Int32 型と Long 型の両方を返すことに注意してください。

typeExampleコレクションについて考えてみましょう。このコレクションは、2 つの同一のドキュメント{ "a": 1 }で構成されています。最初のドキュメントはレガシーの mongo shell で作成され、2 番目のドキュメントは mongosh で作成されました。

$type集計パイプラインで 演算子を使用すると、各シェルに割り当てられた型を確認できます。

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 ts9を使用して、 回を53 1、 の GMT2021 に設定します。

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クエリ演算子は、データ型に対応する string エイリアスまたは数値コードのいずれかを受け入れます。 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