FAQ
項目一覧
このページには、よくある質問とその回答が含まれています。
Tip
このページで問題に対する解決策が見つからない場合は、次のステップとその他のリソースについて問題とヘルプページを参照してください。
MongoDB への接続中にエラーが発生するのはなぜですか?
MongoDB 配置への接続に問題がある場合は、考えられる解決策について接続トラブルシューティング ガイドを参照してください。
Go ドライバーで接続プーリングはどのように機能しますか。
すべてのClient
インスタンスには、MongoDB トポロジー内の各サーバーに対する接続プールが組み込まれています。 接続プールは、MongoDB の同時操作、または goroutine をサポートするためにオンデマンドでソケットを開きます アプリケーション内の を含むドキュメントをインポートしようとすると、エラーを返します。
各接続プールの最大サイズはmaxPoolSize
オプションによって設定され、デフォルトは100
になります。 サーバーへの使用中の接続数がmaxPoolSize
の値に達した場合、そのサーバーへの次のリクエストは、接続が利用可能になるまで待機します。
Client
インスタンスは、サーバーの状態を監視するために MongoDB トポロジー内のサーバーごとに 2 つの追加のソケットを開きます。
たとえば、 3ノードのレプリカセットに接続されたクライアントは、 6監視ソケットを開きます。 また、各サーバー上でアプリケーションの同時操作をサポートするために必要なソケットをmaxPoolSize
の値まで開きます。 maxPoolSize
が100
で、アプリケーションがプライマリ(デフォルト)のみを使用している場合、プライマリ接続プールのみが大きくなり、合計接続数が最大106
になります。 アプリケーションが 読み込み設定( read preference ) を使用してセカンダリ ノードをクエリする場合、それらのプールも大きくなり、合計接続数が306
になる可能性があります。
さらに、接続プールにはレート制限があり、各接続プールは一度に最大でmaxConnecting
の接続のみを並列に作成できます。 次の場合、追加の goroutine は待機を停止します。
既存の goroutine の 1 つが接続の作成を完了するか、既存の接続がプールにチェックバックされます。
接続作成のレート制限により、既存の接続を再利用するドライバーの能力が向上します。
各サーバーへの同時接続の最小数はminPoolSize
オプションを使用して設定できます。このオプションのデフォルトは0
です。 minPoolSize
を設定すると、接続プールはこのソケット数で初期化されます。 ネットワークエラーによってソケットが閉じ、ソケットの合計数(使用中とアイドル状態の両方)が最小値を下回ると、最小値に達するまでソケットが開きます。
接続が削除され、 maxIdleTimeMS
オプションに置き換えられる前に、プール内でアイドル状態を維持できる最大数を設定できます。この値のデフォルトはNone
(制限なし)です。
Client
の次のデフォルト構成はほとんどのアプリケーションで動作します。
client, err := mongo.Connect(options.Client().ApplyURI("<connection string>"))
クライアントはプロセスごとに 1 回作成し、すべての操作で再利用します。 リクエストごとに新しいクライアントを作成することがよくあり、非常に非効率的です。
1 つのプロセス内で多数の同時 MongoDB 操作をサポートするには、 maxPoolSize
を増やすことができます。 プールが最大サイズに達すると、追加の操作はソケットが使用可能になるまで待機します。
ドライバーはソケットが使用可能になるまで待機できる操作の数を制限しません。負荷が急増したときにプールのサイズを境界のあるキューに制限するのはアプリケーションの責任です。 waitQueueTimeoutMS
オプションを定義しない限り、操作は任意の時間待機できます。
ソケットを対象にwaitQueueTimeoutMS
で定義された時間以上待機する操作では、接続エラーが発生します。 すべての操作を完了することよりも、負荷急増中に操作の継続時間を制限することが重要な場合は、このオプションを使用します。
Client.Disconnect()
が任意の goroutine によって呼び出されると、ドライバーはすべてのアイドル ソケットを閉じ、プールに返されるときに使用されているすべてのソケットを閉じます。
「WriteNull は要素または値に配置されている間は書き込みが可能ですが、TopLevel に配置されている場合は 」エラーを修正するにはどうすればよいですか。
bson.Marshal()
メソッドには、 bson.D
型などの BSON ドキュメントにデコードできるパラメータが必要です。 このエラーは、BSON ドキュメント以外の値をbson.Marshal()
に渡すと発生します。
null
をbson.Marshal()
に渡すと、 WriteNull
エラーが発生します。 同様のエラーが発生する可能性のある状況には、次のようなものがあります。
string を
bson.Marshal()
に渡すと、WriteString
エラーが発生します。ブール値を
bson.Marshal()
に渡すと、WriteBoolean
エラーが発生します。bson.Marshal()
に整数を渡すと、WriteInt32
エラーが発生します。
このエラーは、 bson.Marshal()
メソッドを内部的に使用する CRUD 操作を実行している場合、またはbson.Marshal()
を直接呼び出してデータをエンコードしている場合に発生することがあります。
次のコードでは、ドライバーはFindOneAndUpdate()
操作中にsortOrder
のnull
値を BSON にエンコードできないため、 WriteNull
エラーが発生します。
var sortOrder bson.D opts := options.FindOneAndUpdate().SetSort(sortOrder) updateDocument := bson.D{{"$inc", bson.D{{"counter", 1}}}} result := coll.FindOneAndUpdate(context.TODO(), bson.D{}, updateDocument, opts) if err := result.Err(); err != nil { panic(err) }
次のコードは、 sortOrder
変数をbson.D
型として正しく初期化し、ドライバーが BSON に変換できるようにする方法を示しています。
sortOrder := bson.D{}
BSON ドキュメントを JSON に変換するにはどうすればよいですか?
このドライバーは、 MarshalExtJSON()
メソッドなど、BSON ドキュメントを JSON に変換するために使用できるさまざまなマーシャラー メソッドを提供します。 JSON エンコードの読み取り可能な形式を表示するには、アンマーシャラー メソッドまたは string 型のキャストを使用して JSON バイト形式を解析する必要があります。
次のコードでは、 MarshalExtJSON()
メソッドを使用して BSON ドキュメントを JSON に変換し、string 型キャスティングを使用して JSON バイト配列を解析して出力します。
bsonDocument := bson.D{{"hello", "world"}} jsonBytes, err := bson.MarshalExtJSON(bsonDocument, true, false) if err != nil { panic(err) } fmt.Println(string(jsonBytes))
{"hello":"world"}
BSON 型と Go 型の間の変換の詳細については、「 BSON との連携 」ガイドを参照してください。