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 ドキュメントを参照してください。