FAQ
項目一覧
- 一般
- MongoDB インスタンスに接続できない場合はどうなりますか。
- Java ドライバーに
MongoClient
の 2 つのタイプがあるのはなぜですか? - どのタイプの
MongoClient
を使用すればよいか? MongoClientSettings
クラスの使用方法- Java ドライバーで接続プーリングはどのように機能しますか。
- "java.lang.NoClassDefundError: com/ MongoDB /MongoClient" エラーを防ぐにはどうすればよいですか。
- "com.mongodb.MongoSecurityException" エラーを防ぐにはどうすればよいですか。
- 「IllectalArgmentException: Invalid BSON フィールド名」エラーを防ぐにはどうすればよいですか。
- 「IllectalStateException: 状態は オープン でなければなりません」というエラーを防ぐにはどうすればよいですか。
- POJOs
- ID フィールド値を自分で指定する必要がありますか。
- ID フィールドは複合キーにできますか。
- POJO アクターで多形データを使用できますか。
- 弁別子とは何ですか。
LocalDate
の直列化を制御できますか。java.util.Date
をyyy-mm- d 形式の string としてシリアル化できますか。- ゲッターまたはセッターを使用せずに、POJO を フィールドに直接読み取り/書込み (read)/書込み (write) することはできますか。
- プライベート、保護、パブリックのセッターとゲッターを混在させることはできますか。
- 「org.bson.codecs.configuration.CodecConfigurationException: クラス X のコーデックが見つかりません。」を修正するにはどうすればよいですか。
- 特定の POJO クラスのコレクション名を指定するにはどうすればよいですか? 注釈はありますか。
- Legacy API
- レガシー API を使用して MongoDB インスタンスに接続するにはどうすればよいですか。
- レガシーの
MongoClientOptions
クラスとMongoClientURI
クラスの使用方法 - サポート
一般
MongoDB インスタンスに接続できない場合はどうなりますか。
MongoDB 配置への接続で問題が発生した場合に考えられる解決策については、「 接続トラブルシューティング ガイド 」を参照してください。
Javaドライバーに のMongoClient
2 つのタイプがあるのはなぜですか?
MongoClient
には 2 つのタイプがあります。これは、CRUD API を複数含めることの混乱がない、新規ユーザー向けのよりクリーンな API が必要なためです。 新しい CRUD API が Java 9 で導入された Java モジュールのサポートで適した Java パッケージ構造で使用できることを確認する必要がありました。
どのタイプのMongoClient
を使用すればよいか?
新しいアプリケーションは通常、次のことをサポートするcom.mongodb.client.MongoClient
インターフェースを使用します。
MongoClientSettings
とConnectionString
による構成。com.mongodb.client.MongoClients
クラスで定義されたファクトリー メソッドを使用して、このインターフェースのインスタンスを作成できます。MongoDatabase
を使用する CRUD API と、ここからMongoCollection
次のレガシー API をサポートする必要がある場合は、 com.mongodb.MongoClient
クラスを使用します。
MongoClientOptions
とMongoClientURI
による構成DB
を使用し、ここからDBCollection
を使用する CRUD API 。 この API には、getDB()
メソッドからアクセスできます。
新しい API とレガシー API の組み合わせを必要とするアプリケーションの場合、 com.mongodb.MongoClient
は次のものもサポートします。
MongoClientSettings
とConnectionString
による構成。唯一の違いは、ファクトリー クラスではなくコンストラクターを使用して インスタンスを作成することです。MongoDatabase
を使用し、ここからMongoCollection
を使用する CRUD API 。 この API には、getDatabase()
メソッドからアクセスできます。
MongoClientSettings
クラスの使用方法
MongoClientSettings
クラスを使用して、 MongoClient
インスタンスの構成を指定できます。 MongoClientSettings
インスタンスを構築するには、 MongoClientSettings.Builder
クラスを使用します。
以下は、 MongoClientSettings
クラスを使用してさまざまなタスクを実行する方法を示すドキュメントのセクションです。
MongoClientSettings
クラスの詳細については、 MongoClientSettings の APIドキュメントを参照してください。
Java ドライバーで接続プーリングはどのように機能しますか。
すべてのMongoClient
インスタンスには、MongoDB トポロジー内の各サーバーに対する接続プールが組み込まれています。 接続プールはオンデマンドでソケットを開き、マルチスレッド アプリケーションで同時 MongoDB 操作をサポートします。
各接続プールの最大サイズはmaxPoolSize
オプションによって設定され、デフォルトは100
になります。 サーバーへの使用中の接続数がmaxPoolSize
の値に達した場合、そのサーバーへの次のリクエストは、接続が利用可能になるまで待機します。
各MongoClient
インスタンスは、サーバーの状態を監視するために MongoDB トポロジー内のサーバーごとに 2 つの追加のソケットを開きます。
たとえば、3 ノードのレプリカセットに接続されたクライアントは 6 個の監視ソケットを開きます。 また、各サーバー上でアプリケーションのスレッドをサポートするために必要な数のソケットを開きます(上限はmaxPoolSize
の値まで)。 maxPoolSize
が100
で、アプリケーションがプライマリ(デフォルト)のみを使用している場合、プライマリ接続プールのみが増加し、合計接続数は最大106
になります。 アプリケーションが 読み込み設定( read preference ) を使用してセカンダリ ノードをクエリする場合、それらのプールも大きくなり、合計接続数が306
になる可能性があります。
さらに、接続プールにはレート制限があり、各接続プールは一度に最大でmaxConnecting
の接続のみを並列に作成できます。 次の場合、追加のスレッドは待機を停止します。
既存のスレッドの 1 つが接続の作成を完了するか、既存の接続がプールにチェックバックされます。
接続作成のレート制限により、既存の接続を再利用するドライバーの能力が向上します。
minPoolSize
オプションを使用して、各サーバーへの同時接続の最小数を設定できます。デフォルトは0
になります。 接続プールはこのソケット数で初期化されます。 ネットワークエラーによってソケットが閉じられ、ソケットの合計数(使用中とアイドル状態の両方)が最小値を下回る場合、最小値に達するまでさらにソケットが開かれます。
接続が削除され、 maxIdleTimeMS
オプションに置き換えられる前に、プール内でアイドル状態を維持できる最大数を設定できます。この値のデフォルトは0
(制限なし)です。
MongoClient
の次のデフォルト構成はほとんどのアプリケーションで動作します。
MongoClient client = new MongoClient("<connection string>")
クライアントはプロセスごとに 1 回作成し、すべての操作で再利用します。 リクエストごとに新しいクライアントを作成することがよくあり、非常に非効率的です。
1 つのプロセス内で多数の同時 MongoDB 操作をサポートするには、 maxPoolSize
を増やすことができます。 プールが最大サイズに達すると、追加のスレッドはソケットが使用可能になるまで待機します。
ドライバーはソケットが利用可能になるまで待機できるスレッド数を制限しません。負荷が急増したときにプールのサイズを境界のあるキューに制限するのはアプリケーションの責任です。 スレッドはwaitQueueTimeoutMS
オプションで指定された時間だけ待機します。デフォルトは120000
、つまり 120 秒です。
ソケットを取得するためにwaitQueueTimeoutMS
で定義された時間以上待機するスレッドは、接続エラーを発生させます。 すべての操作を完了することよりも、負荷急増中に操作の継続時間を制限することが重要な場合は、このオプションを使用します。
MongoClient.close()
が任意のスレッドによって呼び出されると、ドライバーはすべてのアイドル ソケットを閉じ、プールに返されるときに使用中のすべてのソケットを閉じます。
"java.lang.NoClassDefundError: com/ MongoDB /MongoClient" エラーを防ぐにはどうすればよいですか。
Java ランタイム環境で実行時にクラス ファイルが見つからない場合、 java.lang.NoClassDefFoundError
例外が発生することがあります。 MongoDB Java ドライバーを使用するアプリケーション コードを実行する場合は、クラスパスに適切なドライバー JAR ファイルを含める必要があります。
Java ドライバー JAR ファイルをクラスパスに追加した後にこのエラーが発生した場合は、環境内の次の項目を確認してください。
JAR ファイルは、クラスパスで指定されたロケーションに存在します。
クラスパス構文は正しいです。
環境変数でクラスパスを定義すると、Java ランタイム環境はその変数を使用します。
依存関係マネージャーを使用すると、解決できない競合は報告されません。
Tip
このエラーにはパッケージ名とクラス名が含まれているため、クラスパスからどのドライバー JAR が欠落している可能性があるかを特定できます。 エラーが参照するドライバー JAR を見つけるには、 API ドキュメントの各エントリを確認してください。
"com.mongodb.MongoSecurityException" エラーを防ぐにはどうすればよいですか。
MongoDB 配置に接続するときに無効な、または誤った形式の認証情報を指定すると、アプリケーションはこの例外をスローする可能性があります。
MongoDB 配置に接続しようとしたときにこのエラーが発生した場合は、コード内の次の項目を確認してください。
接続 URI は、正しい MongoDB 配置に対応します。 接続 URI の設定の詳細については、「接続 URI 」を参照してください。
指定した認証メカニズムの認証情報が正しいです。 認証情報を指定する方法については、認証メカニズムおよびエンタープライズ認証メカニズムのガイドを参照してください。
指定した認証データベースの名前が正しい名前を付けました。 MongoDB 配置のユーザーとロールを設定する方法については、サーバー ドキュメントの「 ユーザーとロールの管理」を参照してください。
「IllectalArgmentException: Invalid BSON フィールド名」エラーを防ぐにはどうすればよいですか。
誤った形式のドキュメントを 操作に渡し、かつそれ以前のドライバー バージョン 4.7 またはそれ以前のバージョンを使用している場合、アプリケーションではこの例外がスローされることがあります。
注意
ドライバー バージョン 4.8 以降では、このエラーメッセージは に置き換えられ、どのエラーが誤って形式化されたかに関するより具体的な詳細が含まれるようになりました。
たとえば、次のコード例に示すように、更新操作を呼び出し、更新演算子を誤って省略すると、ドライバーはこのエラーをスローします。
// incorrectly formatted update document collection.updateOne( new Document().append("name", "fizz"), new Document().append("name", "buzz") );
このエラーを回避するには、適切な操作のビルダ クラスを使用します。 このドライバーは、MongoDB 操作用に構文的に正しい BSON を作成するためのビルダ クラスを提供します。 次のコード例に示すように、前の例はビルダ クラスを使用して正しく表現できます。
// Builder class imports import static com.mongodb.client.model.Filters.*; import static com.mongodb.client.model.Updates.*; // ... collection.updateOne(eq("name", "fizz"), set("name", "buzz"));
利用可能なビルダ クラスの詳細については、ビルダのドキュメントを参照してください。
「IllectalStateException: 状態は オープン でなければなりません」というエラーを防ぐにはどうすればよいですか。
MongoDB への接続を閉じたMongoClient
インスタンスに対して 操作を呼び出すと、この例外が発生することがあります。 close()
メソッドがMongoClient
で呼び出されると、そのインスタンスでのそれ以降の操作呼び出しでこの例外がスローされます。
この例外を回避するには、 close()
を呼び出すコードの後に、 MongoClient
インスタンスに対する操作を呼び出さないようにします。
Tip
MongoClient
インスタンスを閉じるコードを見つけるのが困難な場合があります。 この例外の潜在的な原因を見つけるには、次のケースを検索してください。
MongoClient
インスタンスでclose()
を呼び出すMongoClient
が宣言されているtry-with-resources ステートメントの範囲外のMongoClient
インスタンスでの操作呼び出し
アプリケーションでMongoClient
を管理するフレームワークが使用されている場合は、接続動作を管理するためのベストプラクティスを参照してください。
SPI から MongoDB へのアクセスの詳細については、「 SPI と MongoDB 」を参照してください。
POJOs
ID フィールド値を自分で指定する必要がありますか。
いいえ、 PojoCodecProvider
は ObjectId を自動的に生成します。
ID フィールドは複合キーにできますか。
はい。 この例については、次 の実装を参照してください
POJO アクターで多形データを使用できますか。
はい、弁別子を使用します。
弁別子とは何ですか。
弁別子は、特定のドキュメント スキーマを識別するプロパティです。 これは、同じコレクションまたは親ドキュメント(サブドキュメントを埋め込む場合)内に複数のタイプのドキュメントを継承したり保存したりするために使用できます。
たとえば、 MachineEvent
やNetworkEvent
など、Java で拡張するEvent
クラスがある場合、弁別子を使用すると、 PojoCodecProvider
がドキュメントを直列化および逆直列化するために使用する必要があるクラスが識別されます。
の直列化を制御できますか。LocalDate
はい。3.7 Java ドライバーはJSR-310 Instant
、 LocalDate
、 LocalDateTime
のネイティブ サポートを追加します。
を yyy-mm-d形式の string としてシリアル化できますか。java.util.Date
はい、このクラス用に独自のコーデックをビルドし、それをレジストリに追加できます。
コーデックをプロバイダーのリストの最初の、デフォルトのコーデック レジストリの前、およびPojoCodecProvider
の前に追加します。
CodecRegistry registry = CodecRegistries.fromRegistries( CodecRegistries.fromCodecs( new MyDateAsStringCodec()), MongoClientSettings.getDefaultCodecRegistry(), fromProviders(pojoCodecProvider));
ゲッターまたはセッターを使用せずに、POJO を フィールドに直接読み取り/書込み (read)/書込み (write) することはできますか。
パブリック セットが使用できない場合に、リフレクションを通じてプライベート フィールドを設定するSET_PRIVATE_FIELDS_CONVENTION
を使用するようにPojoCodecProvider
を構成できます。
プライベート、保護、パブリックのセッターとゲッターを混在させることはできますか。
いいえ。ネイティブ POJO コーデックでは、ゲッター/セッターが各フィールドに対して同じ修飾子を持つことを前提としています。
たとえば、次のメソッドはエンコード中に の例外をスローします。
private String getField(); public String setField(String x);
「org.bson.codecs.configuration.CodecConfigurationException: クラス X のコーデックが見つかりません。」を修正するにはどうすればよいですか。
この例外は、現在、クラスのコーデックを登録する必要があることを意味します。
特定の POJO クラスのコレクション名を指定するにはどうすればよいですか? 注釈はありますか。
注釈はありません。 次に示すように、クラスに静的stringを追加することをお勧めします。
public class Person { public static final String COLLECTION_NAME = "people"; }
次のスニペットは、特定の POJO クラスのコレクション名を指定します。
database.getCollection(Person.COLLECTION_NAME, Person.class);
Legacy API
レガシー API を使用して MongoDB インスタンスに接続するにはどうすればよいですか。
次の例は、レガシー API と現在の API を使用して MongoDB インスタンスに接続する方法を示しています。
このドキュメントのみを含むコレクションに接続していると仮定します。
{"_id": 1, "val": 1}
MongoClient client = new MongoClient(URI); DB db = client.getDB(DATABASE); DBCollection col = db.getCollection(COLLECTION); // Retrieves one document in the collection and prints it DBObject doc = col.find().one(); System.out.println(doc.toString());
MongoClient client = MongoClients.create(URI); MongoDatabase db = client.getDatabase(DATABASE); MongoCollection<Document> col = db.getCollection(COLLECTION); // Prints the first document retrieved from the collection as JSON Document doc = col.find().first(); System.out.println(doc.toJson());
上記のコード スニペットの出力は、次のようになります。
{"_id": 1, "val": 1}
前の例で使用されているレガシー クラスとメソッドの詳細については、次の API ドキュメント ページを参照してください。
レガシー API と現在の API の違いのリストについては、「 レガシー API からの移行」ページを参照してください。
レガシーのMongoClientOptions
クラスとMongoClientURI
クラスの使用方法
以下は、レガシーのMongoClientOptions
クラスとMongoClientURI
クラスを使用して書込み保証を設定する方法を示す例えです。
MongoClientURI mongoURI = new MongoClientURI(URI, MongoClientOptions.builder() .writeConcern(WriteConcern.W1)); MongoClient client = new MongoClient(mongoURI);
MongoClientSettings options = MongoClientSettings.builder() .applyConnectionString(new ConnectionString(URI)) .writeConcern(WriteConcern.W1).build(); MongoClient client = MongoClients.create(options);
前の例で使用されているレガシー クラスとメソッドの詳細については、次の API ドキュメント ページを参照してください。
レガシー API と現在の API の違いのリストについては、「 レガシー API からの移行」ページを参照してください。
サポート
ここで質問の回答が見つからない場合は、「問題とヘルプ 」セクションに記載されているフォーラムとサポート チャネルをお試しください。