AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

CRUD操作の構成

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

  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) を持つレプリカセットに接続すると、ドライバーはレイテンシーウィンドウ内の最も近い適格なレプリカセットから読み込みます。シャーディングされたクラスターに接続すると、ドライバーはレイテンシーウィンドウ内のアクセス可能なすべての mongos インスタンスから選択します。読み込み設定 (read preference) モードの詳細については、「読み込み設定 (read preference)」を参照してください。

デフォルトで、ドライバーは最も近い適格なサーバーの ping 時間が 15 ミリ秒以内であるサーバーのみを使用します。

例えば、レプリカセットに 5 つのノードがあり、最も近いノードの ping 時間が 5 ミリ秒であるとします。デフォルトの localThresholdMS が 15 ミリ秒の場合、次の表に示すように、ping 時間が 20 ミリ秒以下のノードのみがレイテンシ ウィンドウ内にあります。

Host
タイプ
ping 時間
レイテンシ ウィンドウ内

host1

原発

5ミリ秒

はい

host2

セカンダリ

9ミリ秒

はい

host3

セカンダリ

13ミリ秒

はい

host4

セカンダリ

24ミリ秒

No

host5

セカンダリ

42ミリ秒

No

レイテンシウィンンドウを調整するには、MongoClient() コンストラクターに localThresholdMS オプションを渡します。

次の例えでは、 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 ドキュメントを参照してください。