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

拡張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 形式。
この形式は、人間による読みやすさや古い形式との相互運用性を犠牲にして、型の保持を優先します。この形式の詳細については、APIドキュメントのJsonMode.EXTENDEDを参照してください。

緩和

一部の型情報が失われるBSONドキュメントを記述するstring形式。
この形式は、特定の型情報を犠牲にして、人間による読みやすさと相互運用性を優先します。Java Reactive Streamsドライバーは、デフォルトで緩和モードを使用します。この形式の詳細については、APIドキュメントのJsonMode.RELAXEDを参照してください。

Shell

MongoDB shell で使用される構文に一致する string 形式。
この形式は MongoDB shell との互換性を優先します。MongoDB shell では、型を表示するのに JavaScript 関数が使用されることが多いためです。この形式の詳細については、API ドキュメントの JsonMode.SHELL を参照してください。

注意

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

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

{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": { "$numberLong": "1601499609" }}, "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);

ドキュメント クラスを使用せずに拡張 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 valuejsonReader.readName("_id");ObjectId id = jsonReader.readObjectId(); // Reads the "myNumber" field valuejsonReader.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();

警告

JSONをBSONに変換する前に信頼できない入力を検証する

JSON string を BSON に変換し、クエリ、更新、またはコマンドでその BSON を使用する場合、攻撃者は演算子または予期しないフィールド値を挿入して、操作の意味を変更することができます。このリスクは、JSON がユーザー、API リクエスト、またはその他の信頼できないソースから提供される場合に最も高くなります。

変換前に入力を検証する方法について詳しく学ぶには、「JSONをBSONに変換する前に信頼できない入力を検証する」を参照してください。

このセクションでは、次の方法で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));

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();

拡張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));

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