Overview
このガイドでは、 Node.jsドライバーを使用して読み取りおよび書込み (write) 操作を設定する方法を学習できます。
読み取り設定と書込み設定
読み込み設定 (read preference)を設定することで、ドライバーが読み取り操作をルーティングする方法を制御できます。また、読み取り保証 (read concern)または書込み保証 (write concern)を設定して、ドライバーがデータの整合性と耐久性を処理する方法を制御することもできます。読み取り保証 は読み取り操作を実行するときにデータに必要な耐久性のレベルを指定し、書込み保証 はレプリカセットでの書込み操作の確認をドライバーが待機する方法を指定します。
次のレベルで、書込み保証、読み取り保証、読み込み設定(read preference)のオプションを設定できます。
クライアント(オーバーライドされない限り、すべての操作実行にデフォルトを設定します)
トランザクション
Database
コレクション
前のリストは、 オプション設定の優先順位の増加順も示しています。例、トランザクションに読み取り保証 (read concern)レベルを設定すると、クライアントに設定された読み取り保証 (read concern)レベルが上書きされます。
Tip
読み取りおよび書込み設定の詳細については、MongoDB Server マニュアルの次のガイドを参照してください。
このセクションでは、各レベルで読み取りと書込みを設定する方法を説明します。
クライアント構成
この例では、MongoClientOptionsオブジェクトを コンストラクターに渡すことで、MongoClientインスタンスの読み込み設定 (read preference)、読み取り保証 (read concern))、書込み保証 (write concern)を設定する方法を示しています。このコードは、次の設定を構成します。
SECONDARY読み込み設定 ( 読み込み設定 (read preference)) : 読み取り操作は セカンダリレプリカセットメンバーからデータを取得しますlocal読み取り保証 (read concern)保証 : 読み取り操作は、インスタンスの最新データを返しますが、レプリカセットのノードの過半数にデータが書き込まれたことを保証します2書込み保証 ( 書込み保証 (write concern)) : プライマリと 1 つのセカンダリレプリカセットノードは、書込み (write)操作を確認する必要があります
const clientOptions = { readPreference: ReadPreference.SECONDARY, readConcern: { level: "local" }, writeConcern: { w: 2 }, }; const client = new MongoClient("mongodb://localhost:27017", clientOptions);
あるいは、接続 URI で読み取り設定と書込み設定を指定することもできます。これはMongoClientコンストラクターにパラメーターとして渡されます。
const uri = "mongodb://localhost:27017/?readPreference=secondary&readConcernLevel=local&w=2"; const clientWithUri = new MongoClient(uri);
トランザクション構成
この例では、TransactionOptionsオブジェクトを startTransaction() メソッドに渡すことで、トランザクションの読み込み設定 (read preference)、読み取り保証 (read concern)) 、書込み保証 (write concern)を設定する方法を示しています。このコードは、次の設定を構成します。
PRIMARY読み込み設定 ( 読み込み設定 (read preference)) : 読み取り操作は、 プライマリレプリカセットメンバーからデータを取得しますmajority読み取り保証 (read concern): 読み取り操作は、レプリカセットの過半数に書き込まれたインスタンスの最新データを返します1書込み保証 ( 書込み保証 (write concern)) : プライマリレプリカセットノードは書込み (write)操作を確認する必要があります
const transactionOptions = { readPreference: ReadPreference.PRIMARY, readConcern: { level: "majority" }, writeConcern: { w: 1 }, }; const session = client.startSession(); session.startTransaction(transactionOptions);
データベース構成
この例では、DbOptionsオブジェクトを db() メソッドに渡すことで、test_database というデータベースの読み込み設定 (read preference)、読み取り保証 (read concern)) 、書込み保証 (write concern)を設定する方法を示しています。このコードは、次の設定を構成します。
PRIMARY_PREFERRED読み込み設定 ( 読み込み設定 (read preference)) : 読み取り操作は、プライマリレプリカセットメンバーからデータを取得します。プライマリが使用できない場合は セカンダリ メンバーからデータが取得されますavailable読み取り保証 (read concern)保証 : 読み取り操作は、インスタンスの最新データを返しますが、レプリカセットのノードの過半数にデータが書き込まれたことを保証しますmajority書込み保証( 書込み保証 (write concern) ) : すべてのレプリカセットの過半数が書込み(write)操作を確認する必要があります
const dbOptions = { readPreference: ReadPreference.PRIMARY_PREFERRED, readConcern: { level: "available" }, writeConcern: { w: "majority" }, }; const db = client.db("test_database", dbOptions);
コレクション構成
この例では、CollectionOptionsオブジェクトを collection() メソッドに渡すことで、test_collection というコレクションの読み込み設定 (read preference)、読み取り保証 (read concern)) 、書込み保証 (write concern) を設定する方法を示しています。このコードは、次の設定を構成します。
SECONDARY_PREFERRED読み込み設定 ( 読み込み設定 (read preference)) : 読み取り操作は、セカンダリレプリカセットメンバーからデータを取得します。セカンダリが使用できない場合は、プライマリ ノードからデータが取得されます。available読み取り保証 (read concern)保証 : 読み取り操作は、インスタンスの最新データを返しますが、レプリカセットのノードの過半数にデータが書き込まれたことを保証します0書込み保証 (write concern) : 書込み (write)操作の確認応答をリクエストません
const collOptions = { readPreference: ReadPreference.SECONDARY_PREFERRED, readConcern: { level: "available" }, writeConcern: { w: 0 }, }; const collection = db.collection("test_collection", collOptions);
タグセット
MongoDB Server では、選択した任意の基準に従ってレプリカセット メンバーにキーと値のタグを適用できます。 次に、それらのタグを使用して、1 つ以上のノードを読み取り操作の対象にすることができます。
デフォルトでは 、 Node.jsドライバーは、読み取り元ノードを選択するときに タグを無視します。Node.jsドライバーに特定のタグを優先するように指定するには、それらを読み込み設定 (read preference)クラスコンストラクターのパラメーターとして渡します。
このコード例では、readPreference オプションをタグセットに設定し、セカンダリレプリカセットメンバーからの読み取りを次の順序で優先するよう test_database に指示します。
ニューヨークデータセンターのメンバー(
{ dc: 'ny' })サンフランシスコデータセンターのメンバー(
{ dc: 'sf' })任意のセカンダリ ノード(
{})
const taggedReadPreference = new ReadPreference( ReadPreference.SECONDARY, [ { dc: "ny" }, { dc: "sf" }, {} ] ); const dbWithTags = client.db( "test_database", { readPreference: taggedReadPreference } );
LocalThreshold
指定した読み込み設定 (read preference)とタグセットと一致するレプリカセット ノードが複数ある場合、 Node.jsドライバーはping時間に応じて選択された最も近いレプリカセットノードから読み取ります。
デフォルトでは、ドライバーは ping 時間が最も近いメンバーの15ミリ秒以内であるメンバーのみをクエリに使用します。 より高いレイテンシを持つメンバー間で読み取りを分散するには、 localThresholdMSオプションをMongoClient()コンストラクターに渡します。
次の例えでは、 35ミリ秒のローカルしきい値を指定します。
const clientWithLocalThreshold = new MongoClient("mongodb://localhost:27017", { replicaSet: "repl0", readPreference: ReadPreference.SECONDARY_PREFERRED, localThresholdMS: 35 });
前の例では、 Node.jsドライバーは、最も近いメンバーのping時間の 35 ミリ秒以内に、一致するメンバー間で読み取りを分散します。
注意
Node.jsドライバーは、mongosインスタンスを介してレプリカセットと通信する場合、localThresholdMS の値を無視します。この場合は、localThreshold コマンドライン オプション を使用します。
照合
照合を指定して、読み取り操作と書込み操作の動作を変更できます。照合は、大文字と小文字やアクセント記号など、string を比較するための言語固有のルールのセットです。
MongoDB は、デフォルトで バイナリ照合を使用して string をソートします。このデフォルトの照合では、ASCII 標準 文字値を使用して string を比較および順序付けます。言語とロケールには ASCII 標準とは異なる特定の文字順序付け規則があり、別の照合ルールのセットを操作に適用することを選択できます。
照合は、次のレベルで指定できます。
コレクション:コレクションに対する操作のデフォルトの照合 を設定します。既存のコレクションに対して照合を定義することはできません。
インデックス:インデックスを使用する操作の 照合 を設定します。
操作: 操作の照合を設定し、継承された照合を上書きします。
照合フィールド
照合オブジェクトには、次のフィールドが含まれています。
collation: { locale: <string>, caseLevel: <bool>, caseFirst: <string>, strength: <int>, numericOrdering: <bool>, alternate: <string>, maxVariable: <string>, backwards: <bool> }
collation オプションを設定する場合は、localeフィールドを指定する必要があります。その他のフィールドはすべてオプションです。サポートされているロケールと locale フィールドのデフォルト値の完全なリストについては、 MongoDB Serverマニュアルのサポートされている言語とロケールを参照してください。
照合の例
照合を指定するには、collationオブジェクトを作成し、その localeフィールドに使用する言語照合を設定します。次に、このオブジェクトをターゲット照合レベルに対応するメソッドのオプション パラメーターとして渡します。
このセクションには、コレクション、インデックス、および操作レベルで照合を設定する例が含まれています。
コレクションとインデックスの照合を設定する
次の例では、names という名前の新しいコレクションを作成し、そのデフォルトの照合を "fr_CA"ロケールに設定します。
const db = client.db("db") db.createCollection("names", { collation: { locale: "fr_CA" }, });
次の例に示すように、別の照合を指定するインデックスを namesコレクションに作成できます。
const coll = db.collection("names"); coll.createIndex( { "last_name" : 1 }, { "collation" : { "locale" : "en_US" } });
操作照合の設定
前のセクションで作成された namesコレクションに対して操作を実行し、デフォルトの照合を上書きできます。
names コレクションには次のドキュメントが含まれます。
{ "_id" : 1, "first_name" : "Hans", "last_name" : "Muller" } { "_id" : 2, "first_name" : "Gunter", "last_name" : "Braun" } { "_id" : 3, "first_name" : "Günter", "last_name" : "Krause" } { "_id" : 4, "first_name" : "Jürgen", "last_name" : "Weber" }
この例では、findOneAndUpdate() メソッドを呼び出して、first_name 値が "Gunter" である最初の一致するドキュメントを更新します。このコードは、"de"ロケールと "phonebook"ロケールバリアントを持つ照合を適用します。
coll.findOneAndUpdate( { first_name: { $lt: "Gunter" } }, { $set: { verified: true } }, { collation: { locale: "de@collation=phonebook" } }, );
前の例では、phonebookロケールバリアントは、numlaut のない同じ文字の前に numlaut を持つ文字をソートするようにドライバーに指示しています。その結果、この操作はulごとに、first_name 値が "Günter" で、次の更新情報を返すドキュメントと一致し、次の更新情報を返します。
{ lastErrorObject: { updatedExisting: true, n: 1 }, value: { _id: 3, first_name: 'Günter', last_name: 'Krause' }, ok: 1 }
Tip
ロケールバリアントの詳細については、 MongoDB Serverマニュアルのローカル バリアントを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。