Overview
このガイドでは、 MongoDBドキュメントを操作するときに拡張JSONデータ形式を使用する方法を学習できます。
JSON は、オブジェクト、配列、数値、string、ブール値、null の値を表す人間が判読可能なデータ形式です。この形式は、 MongoDB がデータを保存するために使用する形式であるBSONデータ型のサブセットのみをサポートします。拡張JSON形式はより多くのBSONタイプをサポートしており、 BSONの各タイプに直接対応するフィールドタイプ情報を表すために "$" のプレフィックスが付いたキーの予約セットを定義します。
JSON、 BSON、 拡張JSONの詳細については、JSONとBSONリソースおよび拡張JSON MongoDB Server のマニュアル エントリを参照してください。
拡張 JSON 形式
MongoDB拡張JSON は、 BSONデータを表す string 形式を提供します。各形式はJSON RFCに準拠し、特定のユースケースを満たしています。
次の表は、各 拡張JSON形式について説明したものです。
名前 | 説明 |
|---|---|
拡張または標準 | データ変換時に BSON 型情報が停失しないようにする string 形式。 |
緩和 | 型情報の一部が失われる BSON ドキュメントを記述する string 形式。 |
Shell | MongoDB shellで使用される構文に一致するstring形式。 |
拡張 JSON の例
次の例は、それぞれの拡張 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 の読み取り
このセクションでは、拡張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}}
JsonReader クラスの使用
ドキュメント クラスを使用せずに拡張 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
拡張 JSON の書込み (write)
このセクションでは、次の方法で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}
JsonWriter クラスの使用
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"}}
カスタム BSON 型変換
拡張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 ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。