Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Node.js ドライバー
/

CRUD操作の構成

このガイドでは、 Node.jsドライバーを使用して読み取りおよび書込み (write) 操作を設定する方法を学習できます。

読み込み設定 (read preference)を設定することで、ドライバーが読み取り操作をルーティングする方法を制御できます。また、読み取り保証 (read concern)または書込み保証 (write concern)を設定して、ドライバーがデータの整合性と耐久性を処理する方法を制御することもできます。読み取り保証 は読み取り操作を実行するときにデータに必要な耐久性のレベルを指定し、書込み保証 はレプリカセットでの書込み操作の確認をドライバーが待機する方法を指定します。

次のレベルで、書込み保証、読み取り保証、読み込み設定(read preference)のオプションを設定できます。

  • クライアント(オーバーライドされない限り、すべての操作実行にデフォルトを設定します)

  • トランザクション

  • Database

  • コレクション

前のリストは、 オプション設定の優先順位の増加順も示しています。例、トランザクションに読み取り保証 (read concern)レベルを設定すると、クライアントに設定された読み取り保証 (read concern)レベルが上書きされます。

Tip

読み取りおよび書込み設定の詳細については、MongoDB Server マニュアルの次のガイドを参照してください。

  • 読み込み設定 (read preference)

  • 読み取り保証(read concern)

  • 書込み保証 (write concern)

このセクションでは、各レベルで読み取りと書込みを設定する方法を説明します。

この例では、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 に指示します。

  1. ニューヨークデータセンターのメンバー( { dc: 'ny' }

  2. サンフランシスコデータセンターのメンバー( { dc: 'sf' }

  3. 任意のセカンダリ ノード( {}

const taggedReadPreference = new ReadPreference(
ReadPreference.SECONDARY,
[
{ dc: "ny" },
{ dc: "sf" },
{}
]
);
const dbWithTags = client.db(
"test_database",
{ readPreference: taggedReadPreference }
);

指定した読み込み設定 (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 ドキュメントを参照してください。

戻る

Core API

項目一覧