Docs Menu

FAQ

このページには、よくある質問とその回答が含まれています。

Tip

このページで問題に対する解決策が見つからない場合は、次のステップとその他のリソースについて問題とヘルプページを参照してください。

MongoDB 配置への接続に問題がある場合は、考えられる解決策について接続トラブルシューティング ガイドを参照してください。

すべてのClientインスタンスには、MongoDB トポロジー内の各サーバーに対する接続プールが組み込まれています。 接続プールは、MongoDB の同時操作、または goroutine をサポートするためにオンデマンドでソケットを開きます アプリケーション内の を含むドキュメントをインポートしようとすると、エラーを返します。

各接続プールの最大サイズはmaxPoolSizeオプションによって設定され、デフォルトは100になります。 サーバーへの使用中の接続数がmaxPoolSizeの値に達した場合、そのサーバーへの次のリクエストは、接続が利用可能になるまで待機します。

Clientインスタンスは、サーバーの状態を監視するために MongoDB トポロジー内のサーバーごとに 2 つの追加のソケットを開きます。

たとえば、 3ノードのレプリカセットに接続されたクライアントは、 6監視ソケットを開きます。 また、各サーバー上でアプリケーションの同時操作をサポートするために必要なソケットをmaxPoolSizeの値まで開きます。 maxPoolSize100で、アプリケーションがプライマリ(デフォルト)のみを使用している場合、プライマリ接続プールのみが大きくなり、合計接続数が最大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 によって呼び出されると、ドライバーはすべてのアイドル ソケットを閉じ、プールに返されるときに使用されているすべてのソケットを閉じます。

bson.Marshal()メソッドには、 bson.D型などの BSON ドキュメントにデコードできるパラメータが必要です。 このエラーは、BSON ドキュメント以外の値をbson.Marshal()に渡すと発生します。

nullbson.Marshal()に渡すと、 WriteNullエラーが発生します。 同様のエラーが発生する可能性のある状況には、次のようなものがあります。

  • string をbson.Marshal()に渡すと、 WriteStringエラーが発生します。

  • ブール値をbson.Marshal()に渡すと、 WriteBooleanエラーが発生します。

  • bson.Marshal()に整数を渡すと、 WriteInt32エラーが発生します。

このエラーは、 bson.Marshal()メソッドを内部的に使用する CRUD 操作を実行している場合、またはbson.Marshal()を直接呼び出してデータをエンコードしている場合に発生することがあります。

次のコードでは、ドライバーはFindOneAndUpdate()操作中にsortOrdernull値を 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{}

このドライバーは、 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 との連携 」ガイドを参照してください。