接続ガイド
Overview
このガイドでは、Go ドライバーを使用して MongoDB インスタンスまたはレプリカセットの配置に接続する方法を学習できます。
Go ドライバーを使用して、次の環境でホストされている配置に接続できます。
MongoDB Atlas: MongoDB をクラウドに配置するための完全管理サービス
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型 MongoDB バージョン
接続URI
接続 URI(接続文字列とも呼ばれます)は、MongoDB 配置に接続する方法と、接続中の動作をドライバーに指示します。
接続 URI の一部
次の図は、サンプル接続 URI の各部分について説明しています。
この例では、プロトコルに mongodb
を使用し、標準接続文字列形式を指定します。配置の柔軟性を高め、クライアントを再構成せずにサーバーをローテーションで変更する機能が必要な場合は、DNS シード リスト接続形式を使用することもできます。
接続文字列の次の部分には、ユーザー名と、パスワードベースの認証を使用している場合はパスワードが含まれます。user
の値をユーザー名に、pass
の値をパスワードに置き換えます。ユーザー名とパスワードを必要としない認証メカニズムを使用している場合は、接続 URI のこの部分を省略します。
接続文字列の次の部分は、MongoDB インスタンスのホスト名または IP アドレスとポートを指定します。前の例では、ホスト名としてsample.host
を使用し、ポートとして27017
を使用しています。これらの値を置き換えて、MongoDB インスタンスを指すようにします。
接続stringの最後の部分は、接続オプションと認証オプションを指定します。 この例では、 maxPoolSize=20
とw=majority
の 2 つの接続オプションを設定しています。 接続オプションの詳細については、このガイドの「接続オプション 」セクションをお読みください。
接続例
MongoDB に接続するには、クライアントを作成する必要があります。 クライアントが接続を管理し、データベースコマンドを実行します。
Tip
クライアントの再利用
クライアントは複数のセッションやオペレーションで再利用することをお勧めします。 毎回新しいインスタンスを 1 つ作成するのではなく、同じClient
インスタンスを使用して複数のタスクを実行できます。 Client
型は複数の goroutine によって安全に同時使用できます 。ドライバーで接続プールがどのように機能するかについて詳しくは、 FAQ ページ を参照してください。
ClientOptions
オブジェクトを Connect()
メソッドに渡すことで、接続文字列とその他のクライアント オプションを使用するクライアントを作成できます。
接続 URI を指定するには、それを ApplyURI()
メソッドに渡します。これにより、新しい ClientOptions
インスタンスが返されます。その他のオプションを設定するには、 options
パッケージから関連するヘルパー メソッドを呼び出します。
接続オプションの詳細については、 「接続オプション」セクションを参照してください。クライアントの作成の詳細については、 クライアント および Connect()のAPIドキュメントを参照してください。
新しいサーバー バージョンにアップグレードするときに重大な変更を回避するために、Stable API バージョンをオプションとして設定できます。Stable API 機能について詳しくは、「Stable API」ページをご覧ください。
次のコードは、Atlas接続文字列と Stable API バージョンを使用するクライアントを作成し、MongoDB に接続して、接続が成功したことを確認する方法を示しています。
package main import ( "context" "fmt" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) // Replace the placeholder with your Atlas connection string const uri = "<connection string>" func main() { // Use the SetServerAPIOptions() method to set the Stable API version to 1 serverAPI := options.ServerAPI(options.ServerAPIVersion1) opts := options.Client().ApplyURI(uri).SetServerAPIOptions(serverAPI) // Create a new client and connect to the server client, err := mongo.Connect(context.TODO(), opts) if err != nil { panic(err) } defer func() { if err = client.Disconnect(context.TODO()); err != nil { panic(err) } }() // Send a ping to confirm a successful connection var result bson.M if err := client.Database("admin").RunCommand(context.TODO(), bson.D{{"ping", 1}}).Decode(&result); err != nil { panic(err) } fmt.Println("Pinged your deployment. You successfully connected to MongoDB!") }
Tip
クイック スタート ガイドに従って、Atlas の接続文字列を取得します。
注意
Atlas Serverless への接続の詳細については、必要な最小ドライバー バージョンを特定するために、「サーバーレスインスタンスの制限 」ページを参照してください。
MongoDB に接続する他の方法
Atlas でホストされていない単一の MongoDB 配置またはレプリカセットに接続する場合は、次のセクションで接続方法を確認してください。
ローカルマシン上の MongoDB Server への接続
開発目的でローカル マシン上で MongoDB サーバーを実行する必要がある場合は、次の手順を完了する必要があります。
MongoDB Server の Communityバージョン または Enterprise バージョンをダウンロードします。
MongoDB Serverをインストールして構成します。
サーバーを起動します。
重要
MongoDB サーバーを悪意のある攻撃から常に保護します。セキュリティ推奨事項のリストについては、「セキュリティ チェックリスト」を参照してください。
MongoDB Serverを正常に開始したら、ドライバー接続コードで接続文字列を指定します。
MongoDB Server がローカルで実行されている場合は、接続文字列 "mongodb://localhost:<port>"
を使用できます。ここで、<port>
は、着信接続をリッスンするようにサーバーに設定したポート番号です。
別のホスト名または IP アドレスを指定する必要がある場合は、接続文字列に関するサーバー マニュアルのエントリを参照してください。
サーバーに接続できるかどうかをテストするには、前のコード例の接続文字列を localhost 接続文字列に置き換えます。
レプリカセットへの接続
MongoDB レプリカセットの配置は、同じデータ セットを保存する接続されたインスタンスのグループです。この構成により、データの冗長性と高いデータ可用性が実現します。
レプリカセットの配置に接続するには、各インスタンスのホスト名とポート番号をカンマで区切って指定し、レプリカセット名を接続文字列の replicaSet
パラメーターの値として指定します。次の例では、ホスト名は host1
、 host2
、 host3
で、ポート番号はすべて27017
です。レプリカセット名は myRS
です。
mongodb://host1:27017,host2:27017,host3:27017/?replicaSet=myRS
レプリカセットに接続すると、ドライバーはデフォルトで次のアクションを実行します。
いずれかのノードのアドレスが指定されると、レプリカセットのすべてのノードを検出します。
プライマリに対する書込み指示などの操作を適切なノードに割り振ります。
Tip
レプリカセットに接続するには、1 つのホストのみを指定する必要があります。 ただし、指定したホストが利用できない場合でも接続できるようにするには、ホストの全リストを提供する必要があります。
直接接続
接続 URI で指定されたホストで操作を強制するには、 directConnection
オプションを指定します。直接接続:
SRV 文字列はサポートしていません。
指定されたホストがプライマリでない場合、書き込みは失敗します。
指定されたホストがプライマリでない場合は、セカンダリに読み込み設定 (read preference) を指定する必要があります。
接続オプション
このセクションでは、いくつかの一般的な MongoDB 接続および認証オプションについて説明します。接続 URI のパラメーターとして接続オプションを渡し、クライアントの動作を指定できます。
オプション名 | タイプ | デフォルト値 | 説明 |
---|---|---|---|
timeoutMS | integer | null | Client で実行される単一の操作がタイムアウト エラーを返すまでにかかる時間をミリ秒単位で指定します。操作コンテキストに期限がない場合にのみ、操作はこの設定を尊重します。 |
connectTimeoutMS | integer | 30000 | TCP 接続のタイムアウトまでの待ち時間をミリ秒単位で指定します。 |
maxPoolSize | integer | 100 | 特定の時点で接続プールが持つことができる接続の最大数を指定します。 |
replicaSet | string | null | クラスタのレプリカセット名を指定します。レプリカセット内のすべてのノードは同じレプリカセット名でなければなりません。そうでない場合、クライアントはそれらをセットの一部と見なしません。 |
maxIdleTimeMS | integer | 0 | 接続が削除されて閉じられるまで、接続プール内でアイドル状態を維持できる最大時間を指定します。デフォルトは 0 であり、接続が無期限に未使用のままになることを意味します。 |
minPoolSize | integer | 0 | ドライバーが単一の接続プールで維持する接続の最小数を指定します。 |
socketTimeoutMS | integer | 0 | ネットワークエラーを返す前に、ソケットの読み取りまたは書き込みが返されるまで待機するミリ秒数を指定します。デフォルト値の 0 はタイムアウトがないことを示します。 |
serverSelectionTimeoutMS | integer | 30000 | 操作を実行するために、利用可能で適切なサーバーを見つけるまでの待ち時間をミリ秒単位で指定します。 |
heartbeatFrequencyMS | integer | 10000 | 定期的なバックグラウンド サーバー チェック間の待機時間をミリ秒単位で指定します。 |
tls | ブール値 | false | インスタンスとのトランスポート層セキュリティ (TLS) 接続を確立するかどうかを指定します。接続文字列で DNS シードリスト (SRV) を使用する場合、これは自動的に true に設定されます。値をfalse に設定することで、この動作をオーバーライドできます。 |
w | string or integer | null | 書込み保証 (write concern) を指定します。 値の詳細については、書込み保証( write concern)オプションに関するサーバーのドキュメントを参照してください。 |
directConnection | ブール値 | false | 接続 URI で指定されたホストにすべての操作を強制的にディスパッチするかどうかを指定します。 |
接続オプションの完全なリストについては、 ClientOptions API ドキュメントを参照してください。
Single Timeout Setting
Client
に単独の Timeout
オプションを設定して、SetTimeout()
メソッドを使用するか、接続 URI 文字列で timeoutMS
オプションを指定して、1 回の操作の実行にかかる時間を制御できます。同じエンティティに対する操作のコンテキストを設定しない場合、コード内の他の場所にある Database
、 Collection
、 Session
、 ChangeStream
、および Bucket
インスタンスは、Client
から Timeout
オプションを継承します。
期限が設定されたオペレーションに Context を渡すと、ドライバーでの操作にはその Context の期限が使用されます。Context に期限がない場合、ドライバは Client
に設定された Timeout
オプションを使用して、指定された Context から新しいContext を生成します。
注意
タイムアウト指定による再試行
デフォルト設定では、 Client
にTimeout
オプションを設定しており、操作の再試行が必要な場合、ドライバーはタイムアウト前に操作を可能な限り再試行します。タイムアウトが経過すると、ドライバーはタイムアウトのエラーを返します。Go ドライバーのバージョン 1.1 以降では、再試行可能な読取りと書き込みがデフォルトで有効になります。再試行可能な読み取りと再試行可能な書き込みの詳細については、サーバー マニュアルを参照してください。
次のコードは、 SetTimeout
オプションを使用してClient
にTimeout
オプションを設定する方法を示しています。
opts := options.Client().SetTimeout(5 * time.Second)
次の例では、URI オプションで1つのタイムアウトを設定し、この設定を継承する操作を実行する方法を示します。
uri := "mongodb://user:pass@sample.host:27017/?timeoutMS=5000" client := mongo.Connect(uri) coll := client.Database("<db>").Collection("<collection>") ... coll.InsertOne(context.Background(), doc)
重要
レガシータイムアウトオプション
SocketTimeout
、 wTimeout
、 MaxTime
、およびMaxCommitTime
は、今後のリリースで廃止される予定です。Timeout
を設定すると、ドライバーはMaxTime
とMaxCommitTime
を無視します。 ドライバーは引き続きSocketTimeout
とwTimeout
を尊重しますが、これらの設定により未定義の動作が発生する可能性があります。 代わりに、単一のタイムアウト オプションのみを使用することを検討してください。