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

ドキュメントのデータ形式: 拡張 JSON

このガイドでは、MongoDB Kotlin ドライバーで拡張 JSON 形式を使用する方法を学習できます。

JSON は、オブジェクト、配列、数値、string、ブール値、null の値を表すデータ形式です。 拡張 JSON形式では、BSON の各型に直接対応するフィールド型情報を表すために「 $ 」というプレフィックスが付いたキーの予約セットが定義されます。BSON は MongoDB がデータを保存するために使用する形式です。

このガイドでは、次のトピックについて説明します。

  • さまざまな MongoDB 拡張 JSON 形式

  • BSON ライブラリを使用して、拡張 JSON と Kotlin オブジェクトを変換する方法

  • BSON types のカスタム変換の作成方法

これらの形式の違いの詳細については、 JSON と BSON に関する記事を参照してください。

MongoDB 拡張 JSON は、BSON データを表すためのさまざまな string 形式を機能します。 異なる形式はそれぞれ JSON RFC に準拠し、特定のユースケースを満たしています。 拡張形式は標準形式とも呼ばれますが、情報を失うことなく双方向変換を行うためにすべての BSON 型に特定の表現を備えています。 緩和モード形式は、より簡潔で通常の JSON に近いものですが、数値フィールドの特定のバイトサイズなどのすべての型情報を表すものではありません。

各形式の説明については、次の表を参照してください。

名前
説明

拡張

標準形式とも呼ばれるこの JSON 表示では、BSON 型情報の損失が避けられます。
この形式では、可読性と古い形式との相互運用性を犠牲にして、型の保存が優先されます。

緩和モード

何らかのタイプ情報が失われたBSONドキュメントを記述するJSON表現。
この形式では、特定のタイプ情報を除いて、人間が判読できることと相互運用性を優先します。

Shell

MongoDB shell で使用される構文に一致する JSON 表示。
この形式では、型を表示するために JavaScript 関数を使用することが多い MongoDB shell との互換性が優先されます。

厳密

非推奨。この表現は、JSON RFCに完全に準拠したレガシー形式であり、すべての JSON パーサーで型情報を読み取ることができます。
レガシー API はこの形式を使用します。

注意

ドライバーは、$uuid拡張JSONタイプを string からバイナリ サブタイプ 4 の BsonBinaryオブジェクトに解析します。$uuidフィールド解析の詳細については、拡張JSON仕様の $uuid フィールドを解析するための特別なルール セクションを参照してください。

これらの形式の詳細については、次のリソースを参照してください。

次の例は、それぞれの拡張 JSON 形式で表される ObjectId、date、long 数値フィールドを含むドキュメントを示しています。 表示する例の形式に対応するタブをクリックします。

{
"_id": { "$oid": "573a1391f29313caabcd9637" },
"createdAt": { "$date": { "$numberLong": "1601499609" }},
"numViews": { "$numberLong": "36520312" }
}
{
"_id": { "$oid": "573a1391f29313caabcd9637" },
"createdAt": { "$date": "2020-09-30T18:22:51.648Z" },
"numViews": 36520312
}
{
"_id:": ObjectId("573a1391f29313caabcd9637"),
"createdAt": ISODate("2020-09-30T18:22:51.648Z"),
"numViews": NumberLong("36520312")
}
{
"_id:": { "$oid": "573a1391f29313caabcd9637" },
"createdAt": { "$date": 1601499609 },
"numViews": { "$numberLong": "36520312" }
}

必要なオブジェクトタイプに応じて、 クラスまたは クラスから 静的メソッドを呼び出すことで、拡張 JSON string を Kotlin ドキュメント オブジェクトに読み込むことができます。parse()DocumentBsonDocumentこのメソッドは、いずれかの形式の拡張 JSON string を解析し、データを含むそのクラスのインスタンスを返します。

次の例は、 Documentクラスを使用してサンプルの拡張 JSON string をparse() Documentオブジェクトに読み込む方法を示しています。

val ejsonStr = """
{ "_id": { "${"$"}oid": "507f1f77bcf86cd799439011"},
"myNumber": {"${"$"}numberLong": "4794261" }}
""".trimIndent()
val doc = Document.parse(ejsonStr)
println(doc)
Document{{_id=507f1f77bcf86cd799439011, myNumber=4794261}}

詳細については、ドキュメントガイドの 基礎 ページをご覧ください。

MongoDB Kotlin ドライバーのドキュメント クラスを使用せずに、 JsonReaderクラスを使用して、拡張 JSON string を Kotlin オブジェクトに読み込むこともできます。 このクラスには、拡張 JSON string の任意の形式のフィールドと値を順番に解析するためのメソッドが含まれており、それらは Kotlin オブジェクトとして返されます。 ドライバーのドキュメント クラスは、拡張 JSON を解析するためにこのクラスも使用します。

次のコード例は、 JsonReaderクラスを使用して拡張 JSON string を Kotlin オブジェクトに変換する方法を示しています。

val ejsonStr = """
{ "_id": { "${"$"}oid": "507f1f77bcf86cd799439011"},
"myNumber": {"${"$"}numberLong": "4794261" }}
""".trimIndent()
val jsonReader = JsonReader(ejsonStr)
jsonReader.readStartDocument()
jsonReader.readName("_id")
val id = jsonReader.readObjectId()
jsonReader.readName("myNumber")
val myNumber = jsonReader.readInt64()
jsonReader.readEndDocument()
println(id.toString() + " is type: " + id.javaClass.name)
println(myNumber.toString() + " is type: " + myNumber.javaClass.name)
jsonReader.close()
507f1f77bcf86cd799439011 is type: org.bson.types.ObjectId
4794261 is type: java.lang.Long

詳細については、JsonReader APIドキュメント を参照してください。

拡張 JSON 文字列は、 toJson()メソッドを呼び出し、オプションでJsonWriterSettingsのインスタンスを渡して拡張 JSON 形式を指定することで、 DocumentまたはBsonDocumentのインスタンスから拡張 JSON string を作成できます。

この例では、拡張 JSON を Relaxed モード形式で出力します。

val myDoc = Document().append("_id", ObjectId("507f1f77bcf86cd799439012"))
.append("myNumber", 11223344)
val settings = JsonWriterSettings.builder().outputMode(JsonMode.RELAXED).build()
myDoc.toJson(settings)
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "myNumber": 11223344}

JsonWriterクラスの BSON ライブラリを使用して、 Kotlin オブジェクト内のデータから拡張 JSON string を出力することもできます。 JsonWriterのインスタンスを構築するには、Java Writerのサブクラスを渡して、拡張 JSON の出力方法を指定します。 オプションで、 JsonWriterSettingsインスタンスを渡して、拡張 JSON 形式などのオプションを指定できます。 デフォルトでは、 JsonWriterは 緩和 モード形式を使用します。 MongoDB Kotlin ドライバーのドキュメント クラスも、このクラスを使用して BSON を拡張 JSON に変換します。

次のコード例は、 JsonWriterを使用して拡張 JSON string を作成し、それをSystem.outに出力する方法を示しています。 outputMode()ビルダ メソッドにJsonMode.EXTENDED定数を渡して形式を指定します。

val settings = JsonWriterSettings.builder().outputMode(JsonMode.EXTENDED).build()
JsonWriter(BufferedWriter(OutputStreamWriter(System.out)), settings).use { jsonWriter ->
jsonWriter.writeStartDocument()
jsonWriter.writeObjectId("_id", ObjectId("507f1f77bcf86cd799439012"))
jsonWriter.writeInt64("myNumber", 11223344)
jsonWriter.writeEndDocument()
jsonWriter.flush()
}
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "myNumber": {"$numberLong": "11223344"}}

このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。

JSON 出力の形式を設定するには を指定するだけでなく、 に フィルターoutputMode()JsonWriterSettings.Builder を追加して出力をさらにカスタマイズできます。これらの変換メソッドは Kotlin 型を検出し、それに渡されたConverterによって定義されたロジックを実行します。

次のサンプル コードは、緩和モードの 出力を簡素化するために、LambdaJSON 式として定義される変換子を追加する方法を示しています。

val settings = JsonWriterSettings.builder()
.outputMode(JsonMode.RELAXED)
.objectIdConverter { value, writer -> writer.writeString(value.toHexString()) }
.timestampConverter { value, writer ->
val ldt = LocalDateTime.ofInstant(Instant.ofEpochSecond(value.time.toLong()), ZoneOffset.UTC)
writer.writeString(ldt.format(DateTimeFormatter.ISO_DATE_TIME))
}
.build()
val doc = Document()
.append("_id", ObjectId("507f1f77bcf86cd799439012"))
.append("createdAt", BsonTimestamp(1601516589,1))
.append("myNumber", 4794261)
println(doc.toJson(settings))
{"_id": "507f1f77bcf86cd799439012", "createdAt": "2020-10-01T01:43:09", "myNumber": 4794261}
// Without specifying the converters, the Relaxed mode JSON output
// should look something like this:
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "createdAt": {"$timestamp": {"t": 1601516589, "i": 1}}, "myNumber": 4794261}

このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。