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

拡張JSONデータとの連携

このガイドでは、 MongoDBドキュメントを操作するときに拡張JSONデータ形式を使用する方法を学習できます。

JSON は、オブジェクト、配列、数値、string、ブール値、null の値を表す人間が判読可能なデータ形式です。この形式は、 MongoDB がデータを保存するために使用する形式であるBSONデータ型のサブセットのみをサポートします。拡張JSON形式はより多くのBSONタイプをサポートしており、 BSONの各タイプに直接対応するフィールドタイプ情報を表すために "$" のプレフィックスが付いたキーの予約セットを定義します。

JSON、 BSON、 拡張JSONの詳細については、JSONとBSONリソースおよび拡張JSON MongoDB Server のマニュアル エントリを参照してください。

MongoDB拡張JSON は、 BSONデータを表す string 形式を提供します。各形式はJSON RFCに準拠し、特定のユースケースを満たしています。

次の表は、各 拡張JSON形式について説明したものです。

名前
説明

拡張または標準

データ変換時に BSON 型情報が停失しないようにする string 形式。
この形式は、人間の可読性と古い形式との相互運用性を犠牲にして、型の保存を優先します。JsonMode.EXTENDED

緩和

型情報の一部が失われる BSON ドキュメントを記述する string 形式。
この形式では、特定の型情報を犠牲にして、人間の読みやすさと相互運用性が優先されます。JsonMode.RELAXED

Shell

MongoDB shellで使用される構文に一致するstring形式。
この形式は、タイプの表現にJavaScript関数を使用することが多いMongoDB shellとの互換性を優先します。JsonMode.SHELL

$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")
}

このセクションでは、拡張JSON値を次の方法でJavaオブジェクトに読み込む方法を示します。

拡張JSON string をJavaドキュメントオブジェクトに読み込むには、Document クラスまたは BsonDocumentクラスから parse() 静的メソッドを呼び出します。このメソッドは、拡張JSON string を解析し、そのデータを指定されたドキュメントクラスのインスタンスに保存します。

次の例では、parse() メソッドを使用して、拡張JSON string を Documentオブジェクトに読み取ります。

String ejsonStr = "{ \"_id\": { \"$oid\": \"507f1f77bcf86cd799439011\" },"
+ " \"myNumber\": { \"$numberLong\": \"4794261\" } }";
Document doc = Document.parse(ejsonStr);
System.out.println(doc);
Document{{_id=507f1f77bcf86cd799439011, myNumber=4794261}}

ドキュメントクラスを使用せずに、拡張JSON string をJavaオブジェクトに読み込むには、 BSONライブラリの JsonReaderクラス を使用します。このクラスには、拡張JSON string のフィールドと値を順番に解析し、 Javaオブジェクトとして返すメソッドが含まれています。ドライバーのドキュメントクラスは、 拡張JSONを解析するためにもこのクラスを使用します。

次のコードでは、JsonReaderクラスが提供するメソッドを使用して、拡張JSON string をJavaオブジェクトに変換します。

String string = "{ \"_id\": { \"$oid\": \"507f1f77bcf86cd799439011\" },"
+ " \"myNumber\": { \"$numberLong\": \"4794261\" } }";
JsonReader jsonReader = new JsonReader(string);
jsonReader.readStartDocument();
// Reads the "_id" field value
jsonReader.readName("_id");
ObjectId id = jsonReader.readObjectId();
// Reads the "myNumber" field value
jsonReader.readName("myNumber");
long myNumber = jsonReader.readInt64();
jsonReader.readEndDocument();
System.out.println(id + " is type: " + id.getClass().getName());
System.out.println(myNumber + " is type: " + Long.class.getName());
jsonReader.close();
507f1f77bcf86cd799439011 is type: org.bson.types.ObjectId
4794261 is type: java.lang.Long

このセクションでは、次の方法でJavaオブジェクトから拡張JSON値を書き込む方法を示します。

Document または BsonDocumentオブジェクトから拡張JSON string を書き込むには、toJson() メソッドを呼び出します。このメソッドに JsonWriterSettingsオブジェクトパラメータを渡して、拡張JSON形式を指定できます。

次の例では、Document データを 緩和モード拡張JSONとして書込みます。

Document doc = new Document()
.append("_id", new ObjectId("507f1f77bcf86cd799439012"))
.append("createdAt", Date.from(Instant.ofEpochMilli(1601499609000L)))
.append("myNumber", 4794261);
JsonWriterSettings settings = JsonWriterSettings.builder()
.outputMode(JsonMode.RELAXED)
.build();
System.out.println(doc.toJson(settings));
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "createdAt": {"$date": "2020-09-30T21:00:09Z"}, "myNumber": 4794261}

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

次の例では、JsonWriterオブジェクトを使用して標準モードの拡張JSON string 値を作成し、System.out に出力します。

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

拡張JSON出力形式を指定するだけでなく、JsonWriterSettingsオブジェクトに 変換 を追加して出力をさらにカスタマイズできます。これらの変換メソッドは、変換プロセス中にさまざまなデータ型を処理するためのロジックを指定します。

次の例では、 ドキュメント クラスの使用の例と同じドキュメントを変換しています。ただし、この例では、緩和モードの拡張JSON出力を簡素化するために、JsonWriterSettingsオブジェクトで objectIdConverter()dateTimeConverter() の変換メソッドを定義しています。

JsonWriterSettings settings = JsonWriterSettings.builder()
.outputMode(JsonMode.RELAXED)
.objectIdConverter((value, writer) -> writer.writeString(value.toHexString()))
.dateTimeConverter((value, writer) -> {
ZonedDateTime zonedDateTime = Instant.ofEpochMilli(value).atZone(ZoneOffset.UTC);
writer.writeString(DateTimeFormatter.ISO_DATE_TIME.format(zonedDateTime));
})
.build();
Document doc = new Document()
.append("_id", new ObjectId("507f1f77bcf86cd799439012"))
.append("createdAt", Date.from(Instant.ofEpochMilli(1601499609000L)))
.append("myNumber", 4794261);
System.out.println(doc.toJson(settings));
{"_id": "507f1f77bcf86cd799439012", "createdAt": "2020-09-30T21:00:09Z", "myNumber": 4794261}

このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。