Overview
このガイドでは、 PyMongoで読み取りおよび書込み (write) 操作を構成する方法を学習できます。
読み取り設定と書込み設定
読み込み設定( read preference ) を設定することで、ドライバーが読み取り操作をルーティングする方法を制御できます。 また、読み取り保証 ( read concern ) と書込み保証 ( write concern ) を設定して、ドライバーがレプリカセットでの読み取りおよび書込み (write) 操作の確認を待機する方法のオプションも制御できます。
デフォルトでは、データベースはMongoClientインスタンスからこれらの設定を継承し、コレクションは データベースからこれらを継承します。 ただし、次のいずれかの方法を使用して、データベースまたはコレクションのこれらの設定を変更できます。
get_database(): データベースを取得し、クライアントの読み込み設定(read preference)、読み取り保証(read concern)、書込み設定(write preference)を適用します。database.with_options(): データベースを取得し、現在の読み込み設定(read preference)、読み取り保証(read concern)、書込み設定(write preference)を適用します。get_collection(): コレクションを取得し、その現在の読み込み設定(read preference)、読み取り保証(read concern)、書込み設定(write preference)を適用します。collection.with_options(): コレクションを取得し、データベースの読み込み設定(read preference)、読み取り保証(read concern)、書込み設定(write preference)を適用します。
前述のメソッドを使用して読み取りまたは書込み設定を変更するには、 メソッドを呼び出して、コレクションまたはデータベース名と新しい読み込み設定(read preference)、読み取り保証(read concern)、または書込み設定(write preference)を渡します。
次の例では、 get_database()メソッドを使用して、 test-databaseというデータベースの読み取り設定、読み取り保証、書込み設定を変更する方法を示しています。
client.get_database("test-database", read_preference=ReadPreference.SECONDARY, read_concern="local", write_concern="majority")
次の例では、 get_collection()メソッドを使用して、 test-collectionというコレクションの読み取りおよび書込み設定を変更する方法を示します。
database.get_collection("test-collection", read_preference=ReadPreference.SECONDARY, read_concern="local", write_concern="majority")
次の例では、 with_options()メソッドを使用して、 test-collectionというコレクションの読み取りおよび書込み設定を変更する方法を示します。
collection.with_options(read_preference=ReadPreference.SECONDARY, read_concern="local", write_concern="majority")
Tip
ReadPreference列挙で使用可能な読み込み設定(read preference)の種類を確認するには、APIドキュメントを参照してください。
読み取りおよび書込み設定の詳細については、MongoDB Server マニュアルの次のガイドを参照してください。
タグセット
MongoDB Server では、選択した任意の基準に従ってレプリカセット メンバーにキーと値のタグを適用できます。 次に、それらのタグを使用して、1 つ以上のノードを読み取り操作の対象にすることができます。
デフォルトでは 、 PyMongo は読み取りノードを選択するときに タグを無視します。特定のタグを優先するようにPyMongoに指示するには、それらを読み込み設定 (read preference)クラスコンストラクターのパラメーターとして渡します。
次のコード例では、 read_preferenceパラメーターに渡されるタグセットは、PyMongo に対して、ニューヨーク データセンター( 'dc': 'ny' )からの読み取りを優先し、サンフランシスコ データセンター( 'dc': 'sf' )にフォールバックするように指示します。
db = client.get_database( 'test', read_preference=Secondary([{'dc': 'ny'}, {'dc': 'sf'}]))
LocalThreshold
プライマリ以外の読み込み設定 (read preference) を持つレプリカセットに接続すると、ドライバーはレイテンシーウィンドウ内の最も近い適格なレプリカセットから読み込みます。シャーディングされたクラスターに接続すると、ドライバーはレイテンシーウィンドウ内のアクセス可能なすべての mongos インスタンスから選択します。読み込み設定 (read preference) モードの詳細については、「読み込み設定 (read preference)」を参照してください。
デフォルトで、ドライバーは最も近い適格なサーバーの ping 時間が 15 ミリ秒以内であるサーバーのみを使用します。
例えば、レプリカセットに 5 つのノードがあり、最も近いノードの ping 時間が 5 ミリ秒であるとします。デフォルトの localThresholdMS が 15 ミリ秒の場合、次の表に示すように、ping 時間が 20 ミリ秒以下のノードのみがレイテンシ ウィンドウ内にあります。
Host | タイプ | ping 時間 | レイテンシ ウィンドウ内 |
|---|---|---|---|
| 原発 | 5ミリ秒 | はい |
| セカンダリ | 9ミリ秒 | はい |
| セカンダリ | 13ミリ秒 | はい |
| セカンダリ | 24ミリ秒 | No |
| セカンダリ | 42ミリ秒 | No |
レイテンシウィンンドウを調整するには、MongoClient() コンストラクターに localThresholdMS オプションを渡します。
次の例では、35 ミリ秒のローカルしきい値を指定します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
client = MongoClient(replicaSet='repl0', readPreference=ReadPreference.SECONDARY_PREFERRED, localThresholdMS=35)
client = AsyncMongoClient(replicaSet='repl0', readPreference=ReadPreference.SECONDARY_PREFERRED, localThresholdMS=35)
前の例では、PyMongo はノードの ping 時間の35ミリ秒以内に、一致するノード間で読み取りを分散します。
注意
PyMongo は、 mongosインスタンスを介してレプリカセットと通信する場合、 localThresholdMSの値を無視します。 この場合は、 localThresholdコマンドライン オプション を使用します。
再試行可能な読み取りと書込み
PyMongo は、ネットワークまたはサーバーのエラーによって失敗した場合に、特定の読み取りおよび書き込み操作が 1 回自動的に再試行します。
再試行可能な読み取りまたは再試行可能な書込みを明示的に無効にするには、MongoClient() コンストラクターで retryReads または retryWrites オプションを False に設定します。次の例では、クライアントの再試行可能な読み取りと書込みを無効にします。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
client = MongoClient("<connection string>", retryReads=False, retryWrites=False)
client = AsyncMongoClient("<connection string>", retryReads=False, retryWrites=False)
サポートされている再試行可能な読み取り操作の詳細については、 MongoDB Serverマニュアルの「 再試行可能な読み取り 」を参照してください。サポートされている再試行可能な書込み操作の詳細については、 MongoDB Serverマニュアルの「 再試行可能な書込み 」を参照してください。
過負荷再試行オプション
サーバーが過負荷エラーを返したときにPyMongo が操作をどのように処理するかを設定するには、次のクライアントオプションを使用します。
enable_overload_retargeting: ドライバーが過負荷エラーを返すサーバーの優先順位を下げ、同じ過負荷サーバーで再試行する可能性を減らします。デフォルト値はFalseです。max_adaptive_retries:サーバーが過負荷エラーを返した場合にドライバーが操作を再試行する最大回数を指定します。デフォルト値は2です。
次の例では、MongoClient を作成し、過負荷再試行オプションを構成しています。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
client = MongoClient("<connection string>", enable_overload_retargeting=True, max_adaptive_retries=3)
client = AsyncMongoClient("<connection string>", enable_overload_retargeting=True, max_adaptive_retries=3)
照合
コレクションを作成すると、コレクションに対して実行するすべての操作のデフォルトの照合を指定できます。
照合は、大文字と小文字やアクセント記号など、string を比較するための言語固有のルールのセットです。
照合を指定するには、CollationクラスまたはPython辞書のインスタンスを作成します。Collation コンストラクターに渡すオプション、または辞書のキーとして含めるオプションのリストについては、 MongoDB Serverマニュアルの 照合 を参照してください。
Tip
照合のインポート
Collationクラスのインスタンスを作成するには、pymongo.collation からインポートする必要があります。
次の例では、 前の例と同じコレクションを作成していますが、デフォルトの照合は fr_CA です。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
from pymongo.collation import Collation database = client["test_database"] database.create_collection("example_collection", collation=Collation(locale='fr_CA'))
from pymongo.collation import Collation database = client["test_database"] await database.create_collection("example_collection", collation=Collation(locale='fr_CA'))