重要
非推奨の mongosh メソッド
This method is deprecated in mongosh. For alternative methods, see Compatibility Changes with Legacy mongo Shell.
定義
db.collection.update(query, update, options)Modifies an existing document or documents in a collection. The method can modify specific fields of an existing document or documents or replace an existing document entirely, depending on the update parameter.
By default, the
db.collection.update()method updates a single document. Include the option multi: true to update all documents that match the query criteria.
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud
注意
This command is supported in all MongoDB Atlas clusters. For information on Atlas support for all commands, see Unsupported Commands.
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
バージョン5.0で変更。
db.collection.update()メソッドの形式は次のとおりです。
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document>, collation: <document>, arrayFilters: [ <filterdocument1>, ... ], hint: <document|string>, let: <document>, maxTimeMS: <int>, bypassDocumentValidation: <boolean> } )
パラメーター
db.collection.update() メソッドは次のパラメータを取ります。
Parameter | タイプ | 説明 | |||||
|---|---|---|---|---|---|---|---|
ドキュメント | 更新の選択基準。 When you execute an | ||||||
ドキュメントまたはパイプライン | 適用される変更内容。次のいずれかになります。
詳細と例については、「Oplog エントリ」を参照してください。 | ||||||
ブール値 | Optional. When
複数のアップサートを回避するため、 デフォルトは | ||||||
ブール値 | Optional. If set to | ||||||
ドキュメント | 任意。書込み保証 (write concern) を表現するドキュメント。省略すると、デフォルトの書込み保証 (write concern) トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。
| ||||||
ドキュメント | 任意。 照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。 For an example using | ||||||
配列 | 任意。配列フィールドの更新操作でどの配列要素を変更するかを決定するフィルター ドキュメントの配列。 In the update document, use the 識別子が更新ドキュメントに含まれていない場合、識別子の配列フィルター ドキュメントを作成することはできません。 For examples, see Array Update Operations. | ||||||
ドキュメントまたは文字列 | Optional. A document or string that specifies the index to use to support the query predicate. このオプションには、インデックス仕様ドキュメントまたはインデックス名の文字列を指定できます。 存在しないインデックスを指定した場合、操作はエラーになります。 For an example, see Specify | ||||||
ドキュメント | 任意。 変数のリストを含むドキュメントを指定します。これにより、変数をクエリテキストから分離することで、コマンドの読みやすさを向上させることができます。 ドキュメントの構文は次のとおりです。 変数は式によって返された値に設定され、その後は変更できません。 コマンド内の変数の値にアクセスするには、二重ドル記号の接頭辞( 結果のフィルタリングに変数を使用するには、 For a complete example using | ||||||
integer | 任意。タイムアウトするまでに更新操作を実行する時間制限をミリ秒単位で指定します。 | ||||||
ブール値 | オプション。 |
戻り値
The method returns a WriteResult document that contains the status of the operation.
アクセス制御
authorizationを使用して実行されている配置では、ユーザーには次の特権を含むアクセス権が必要です。
update指定したコレクションに対するアクション。find指定したコレクションに対するアクション。insert操作の結果がアップサートになる場合、指定されたコレクションに対して実行されるアクション。
組み込みロール readWrite は必要な特権を提供します。
動作
制限
multi: true を設定した場合、update() メソッドは冪等演算にのみ使用してください。
Upsertを使用した更新で $expr を使用する
Attempting to use the $expr operator with the upsert flag set to true generates an error.
シャーディングされたコレクション
シャーディングされたコレクションで multi: false と一緒に db.collection.update() を使用するには、_id フィールドに完全一致を含めるか、単一のシャードをターゲットにする(シャードキーを含めるなど)必要があります。
db.collection.update() が更新操作(ドキュメント置換操作ではない)を実行する場合、db.collection.update() では複数のシャードをターゲットにできます。
シャーディングされたコレクションでドキュメント操作を置換する
ドキュメント置き換え操作では、まずクエリフィルターを使用して 1 つのシャードに対象を絞り込もうとします。クエリフィルターで 1 つのシャードに絞り込めない場合は、置き換えドキュメントで絞り込もうとします。
以前のバージョンでは、この操作では置換ドキュメントを使用するターゲットを試行します。
upsert シャーディングされたコレクション
For a db.collection.update() operation that includes upsert: true and is on a sharded collection, you must include the full shard key in the filter:
更新操作に使用します。
ドキュメントの置き換え操作用。
ただし、シャーディングされたコレクション内のドキュメントにはシャードキー フィールドがない場合があります。シャードキーがないドキュメントを対象とするには、null の等価一致を別のフィルター条件(_id フィールド上と同様に)と組み合わせて使用できます。例え:
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
シャードキーの変更
シャードキー フィールドが不変の _id フィールドでない限り、ドキュメントのシャードキー値を更新できます。
db.collection.update()で既存のシャードキー値を変更するには:
必ず
mongos上で使用します。シャードに直接操作を実行しないでください。トランザクション内で、または 再試行可能な書き込みとして実行する必要があります。
必ず
multi: falseを指定します。You must include an equality query filter on the full shard key.
Tip
欠落しているキー値は NULL 等価一致の一部として返されるため、NULL 値のキーが更新されないように、必要に応じて追加のクエリ条件(_id フィールドなど)を追加します。
See also upsert on a Sharded Collection.
欠落しているシャードキー
シャーディングされたコレクション内のドキュメントには、シャードキー フィールドがない場合があります。db.collection.update()を使用してドキュメントの 欠落している シャードキーを設定するには、 で実行するmongos 必要があります 。シャードに対して直接操作を実行しないでください。
さらに、次の要件も適用されます。
タスク | 要件 |
|---|---|
設定するには |
|
|
|
Tip
欠落しているキー値は NULL 等価一致の一部として返されるため、NULL 値のキーが更新されないように、必要に応じて追加のクエリ条件(_id フィールドなど)を追加します。
以下も参照してください。
トランザクション
db.collection.update() は分散トランザクション内で使用できます。
重要
ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。
トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。
トランザクション内のアップサート
トランザクションがクロスシャード間書き込みトランザクション(write transaction)でない場合に、分散トランザクション内にコレクションとインデックスを作成できます。
db.collection.update() upsert: true は、既存のコレクションまたは存在しないコレクションで実行できます。存在しないコレクションで実行すると、操作によってコレクションが作成されます。
書込み保証とトランザクション
トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。
Oplog エントリ
db.collection.update() 操作によって 1 つ以上のドキュメントが正常に更新されると、その操作によって oplog(操作ログ)にエントリーが追加されます。操作が失敗した場合、または更新するドキュメントが見つからなかった場合は、その操作によって oplog にエントリーが追加されることはありません。
ドット表記_id クエリによるアップサート
When you execute an update() with upsert: true and the query matches no existing document, MongoDB will refuse to insert a new document if the query specifies conditions on the _id field using dot notation.
この制限により、_id ドキュメントに埋め込まれたフィールドの順序が明確に定義され、クエリで指定された順序に縛られることがなくなります。
この方法でドキュメントを挿入しようとすると、 MongoDB はエラーを発生させます。
重複した値のアップサート
重複を防ぐためのユニークインデックスがない限り、アップサートによって重複したドキュメントが作成されることがあります。
クライアントがデータを正常に挿入する前にすべての db.collection.update() 操作がクエリ フェーズを終了し、かつ nameフィールドにユニークインデックスがない場合、各 db.collection.update()操作によって挿入が行われ、name: Andy を持つ複数のドキュメントが作成される可能性があります。
nameフィールドにユニークインデックスを設定すると、ドキュメントが1 つだけ作成されるようになります。ユニークインデックスが設定されると、複数の db.collection.update() 操作で次の動作が見られるようになります。
- 正確に 1 つの
db.collection.update()操作で新しいものを正常に挿入します。 - ドキュメント。
- 正確に 1 つの
- その他の
db.collection.update()操作は、新しく挿入された ドキュメントまたは、一意なキーの競合が原因で失敗します。
新しく挿入されたドキュメントを更新するための他の
db.collection.update()操作では、次の条件が すべて 満たされている必要があります。- ターゲットコレクションにユニークインデックスがあると、
- 重複キー エラー。
- 更新操作が
updateManyではない、またはmultiは false.
- 更新操作が
アップデートの一致条件は、次のいずれかです。
単一の等価述語。例:
{ "fieldA" : "valueA" }等価述語の論理 AND。例:
{ "fieldA" : "valueA", "fieldB" : "valueB" }
- 等価述語内のフィールドが次内のフィールドと一致
- ユニークインデックスキー パターン。
- 更新操作が、 内のフィールドを変更しない。
- ユニークインデックスキー パターン。
- その他の
Tip
配列更新操作
アップデート ドキュメントでは、$[<identifier>] フィルター処理された位置演算子を使用して識別子を定義し、配列フィルター ドキュメントで参照します。識別子がアップデートドキュメントに含まれていない場合、識別子の配列フィルタードキュメントを作成することはできません。
<identifier>は小文字で始まり、含めることができるのは英数字のみです。
アップデートドキュメントには同じ識別子を複数回含めることができます。ただし、 更新ドキュメント内の個別の識別子 ($[identifier]) それぞれに対し、対応する配列フィルタードキュメント を1 つだけ 指定する必要があります。つまり、同じ識別子に対して複数の配列フィルター ドキュメントを指定することはできません。ただし、単一のフィルタードキュメント内の同じ識別子に複合条件を指定できます
注意
arrayFilters は、集計パイプラインが使用される更新では使用できません。
WriteResult
正常な結果
db.collection.update() メソッドは、操作のステータスを含む WriteResult() オブジェクトを返します。成功すると、WriteResult() オブジェクトには、クエリ条件に一致したドキュメントの数、更新によって挿入されたドキュメントの数、および変更されたドキュメントの数が含まれます。
書込み保証 (write concern) エラー
db.collection.update() メソッドで書込み保証 (write concern) エラーが発生した場合、結果には WriteResult.writeConcernError フィールドが含まれます。
次の表は、WriteResult.writeConcernError.provenanceの値について説明したものです。
出所 | 説明 |
|---|---|
| 書き込み保証(write concern)がアプリケーションで指定されました。 |
| 書込み保証 (write concern) は、カスタム定義されたデフォルト値に基づきます。 |
| 書込み保証 (write concern) は、レプリカセットの |
| 他の書き込み保証(write concern)が一切指定されていない状態で、サーバーから発生した書き込み保証。 |
書込み保証 (write concern) とは関係のないエラー
db.collection.update() メソッドで書込み保証以外のエラーが発生した場合、結果には WriteResult.writeError フィールドが含まれます。
例
このページの例では、sample_mflix データセット のデータを使用しています。自己管理型 MongoDB 配置にこのデータセットをロードする方法の詳細については、「サンプル データセットのロード」を参照してください。サンプル データベースに何らかの変更を加えた場合は、今ページの例を実行するには、データベースを削除して再作成する必要がある可能性があります。
更新演算子式($inc および$set )を使用する
<update> ドキュメントに、$set 修飾子を使用するような、更新演算子 が含まれている場合は、次のようになります。
<update>ドキュメントには、更新演算子式のみを含める必要があります。db.collection.update()メソッドは、ドキュメント内の対応するフィールドのみを更新します。埋め込みドキュメントまたは配列全体を更新するには、フィールドの置換値を指定します。
埋め込みドキュメントまたは配列内の特定のフィールドを更新するには、ドット表記を使用してフィールドを指定します。
db.movies.update( { title: "The Godfather" }, { $inc: { "tomatoes.viewer.numReviews": 1 }, $set: { "tomatoes.viewer.meter": 99 } } ) /* Corresponds to the following SQL statement: * UPDATE movies * SET tomatoes_viewer_numReviews = tomatoes_viewer_numReviews + 1, * tomatoes_viewer_meter = 99 * WHERE title = "The Godfather" */
この操作において:
{ title: "The Godfather" }の<query>パラメータは更新するドキュメントを指定します$inc演算子がtomatoes.viewer埋め込みドキュメントのnumReviewsフィールドを増加させます$set演算子は、tomatoes.viewer埋め込みドキュメントのmeterフィールドを更新します。
query パラメータが複数のドキュメントと一致した場合、この操作では一致するドキュメントが 1 つだけ更新されます。複数のドキュメントを更新するには、multi オプションを true に設定します。
フィールドの削除($unset )
次の操作では、$unset 演算子を使用して、"GOd"ドキュメントから metacriticフィールドを削除します。
db.movies.update( { title: "The Godfather" }, { $unset: { metacritic: "" } } ) /* $unset is similar (but not identical) to the following SQL command which removes the ``metacritic`` field from the ``movies`` table * UPDATE movies * SET metacritic = NULL * WHERE title = "The Godfather" */
更新後、metacriticフィールドは削除されます。
複数のドキュメントを更新する(multi を使用した $update)
multi がtrue に設定されている場合、db.collection.update() メソッドは <query> 条件を満たすすべてのドキュメントを更新します。multi 更新操作は、他の読み取り/書き込み操作とインターリーブする可能性があります。
次の操作は、タイトルが「GOdFAther」または「Atlas 」のいずれかのドキュメントの test_fieldフィールドを true に設定します。
db.movies.update( { title: { $in: ["The Godfather", "The Matrix"] } }, { $set: { test_field: true } }, { multi: true } ) /* Corresponds to the following SQL statement: * UPDATE movies * SET test_field = true * WHERE title IN ('The Godfather', 'The Matrix') */
この操作、一致する両方のドキュメントが更新されます。
You cannot specify multi: true when performing a replacement and the update document contains only field:value expressions.
Tip
一致するものが存在しない場合は新しいドキュメントを挿入する(Upsert)
When you specify the option upsert: true:
ドキュメントがクエリ条件に一致する場合、
db.collection.update()は更新を実行します。クエリ条件に一致するドキュメントがない場合、
db.collection.update()は 1 つのドキュメントを挿入します。注意
If multiple, identical upserts are issued at roughly the same time, it is possible for
update()used with upsert: true to create duplicate documents. See Upsert with Duplicate Values for more information.
If you specify upsert: true on a sharded collection, you must include the full shard key in the filter. For additional db.collection.update() behavior on a sharded collection, see Sharded Collections.
次のタブでは、 update()を使用した upsert修飾子の様々な使用方法を紹介します。
置換ドキュメントのアップサート
クエリ条件に一致するドキュメントがなく、<update> パラメーターが置換ドキュメント(フィールドと値のペアのみを含むドキュメント)の場合、更新により、置換ドキュメントのフィールドと値を含む新しいドキュメントが挿入されます。
クエリ パラメーターまたは置換ドキュメントのいずれかに
_idフィールドを指定した場合、MongoDB は、挿入されるドキュメントでその_idフィールドを使用します。クエリ パラメーターまたは置換ドキュメントのいずれにも
_idフィールドを指定しない場合、MongoDB はランダムに生成された ObjectId 値を持つ_idフィールドを追加します。クエリ パラメーターと置換ドキュメントで異なる
_idフィールド値を指定することはできません。指定すると、操作はエラーを返します。
For example, the following update sets the upsert option to true:
db.movies.update( { title: "Test Movie 12345" }, { $set: { title: "Test Movie 12345", year: 2024, genres: [ "Documentary" ], rated: "NR" } }, { upsert: true } )
If no document matches the <query> parameter, the update operation inserts a document with only the replacement document. Because no _id field was specified in the replacement document or query document, the operation creates a new unique ObjectId for the new document's _id field. You can see the upsert reflected in the WriteResult of the operation.
演算子式を使用したアップサート($set)
クエリ条件に一致するドキュメントがなく、<update> パラメーターが更新演算子式を含むドキュメントである場合、この操作はでは、<query> パラメーターの等価句から基本ドキュメントを作成し、<update> パラメーターの式を適用します。
<query>からの比較操作は新しいドキュメントに含まれません。 新しいドキュメントに_idフィールドが含まれていない場合、MongoDB はObjectId値を持つ_idフィールドを追加します。
For example, the following update sets the upsert option to true:
db.movies.update( { title: "Test Movie 67890" }, // Query parameter { // Update document $set: { rated: "PG" }, $setOnInsert: { year: 2024, type: "movie" } }, { upsert: true } // Options )
クエリ条件に一致するドキュメントがない場合、操作は対応するドキュメントを挿入します。
Tip
集計パイプラインを使用したアップサート
If the <update> parameter is an aggregation pipeline, the update creates a base document from the equality clauses in the <query> parameter, and then applies the pipeline to the document to create the document to insert. If the new document does not include the _id field, MongoDB adds the _id field with an ObjectId value.
例、次の集計パイプラインでは、クエリフィルターに一致する既存のドキュメントが存在しないため、moviesコレクションに新しいドキュメントが挿入されます。
db.movies.update( { title: "Test Movie ABC123" }, // Query parameter [ // Aggregation pipeline { $set: { year: 2024, type: "movie", rated: "NR", lastModified: "$$NOW" } } ], { upsert: true } // Options )
Tip
For additional examples of updates using aggregation pipelines, see Update with Aggregation Pipeline.
upsert と multi を使用する(一致)
次の操作では、multi オプションと upsert オプションの両方を指定します。一致するドキュメントが存在する場合、この操作により一致するすべてのドキュメントが更新されます。一致するドキュメントが存在しない場合は、この操作によって新しいドキュメントが挿入されます。
db.movies.update( { title: { $in: ["The Godfather", "The Matrix"] } }, { $set: { test_upsert_field: true } }, { upsert: true, multi: true } )
両方の映画がコレクションに存在するため、操作は一致するドキュメントの両方を更新します。
upsert と multi を使用する(一致なし)
コレクションに一致するドキュメントがない場合、この操作を行うと、<query> と <update> の両方の仕様のフィールドを使用して単一のドキュメントが挿入されます。例えば、次の操作について考えてみましょう。
db.movies.update( { "title": "Test Movie Unique789" }, { $set: { year: 2024, type: "movie" } }, { upsert: true, multi: true } )
この操作は、対応するドキュメントを moviesコレクションに挿入します。
集約パイプラインによるアップデート
db.collection.update() メソッドでは、実行する変更を指定する 集計パイプライン [ <stage1>, <stage2>, ... ] を受け入れることができます。パイプラインは次のステージで構成できます。
$addFieldsおよびそのエイリアス$set$replaceRootおよびそのエイリアス$replaceWith
集計パイプラインを使用すると、現在のフィールド値に基づいて条件付きのアップデートを表現したり、あるフィールドを他のフィールドの値を使用してアップデートするなど、より表現内容の多いアップデート ステートメントが可能になります。
ドキュメントの他のフィールドの値を使用してフィールドを変更する
次の例では、これらの操作を実行する集計パイプラインと、映画のタイトルと年を組み合わせた displayTitleフィールドを作成します。
は、
titleフィールドとyearフィールドを連結してdisplayTitleフィールドを作成しますlastModifiedタイムスタンプを設定する
db.movies.update( { title: "The Godfather" }, [ { $set: { displayTitle: { $concat: [ "$title", " (", { $toString: "$year" }, ")" ] }, lastModified: "$$NOW" } } ] )
Tip
現在のフィールド値に基づいて条件付き更新を実行する
次の例では、 2015 にリリースされた映画を更新して、 IMDB と 権限の合計評価スコアを計算し、スコアに基づいてグレードを割り当てます。
db.movies.update( { year: 2015, "imdb.rating": { $type: "number" }, "tomatoes.viewer.rating": { $type: "number" } }, [ { $set: { combinedScore: { $round: [ { $avg: [ { $multiply: [ "$imdb.rating", 10 ] }, { $multiply: [ "$tomatoes.viewer.rating", 10 ] } ] }, 1 ] }, lastUpdate: "$$NOW" } }, { $set: { grade: { $switch: { branches: [ { case: { $gte: [ "$combinedScore", 80 ] }, then: "A" }, { case: { $gte: [ "$combinedScore", 70 ] }, then: "B" }, { case: { $gte: [ "$combinedScore", 60 ] }, then: "C" }, { case: { $gte: [ "$combinedScore", 50 ] }, then: "D" } ], default: "F" } } } } ], { multi: true } )
$set段階:
Tip
配列更新操作での arrayFilters の指定
arrayFilters 条件に一致する要素を更新する
To update all array elements which match a specified criteria, use the arrayFilters parameter.
次の例では、languages 配列に "English" を含むすべての映画を更新します。この操作により、"English" は "EN" に置き換えられます。
db.movies.update( { languages: "English" }, { $set: { "languages.$[element]" : "EN" } }, { arrayFilters: [ { "element": "English" } ], multi: true } )
パターン一致を使用して配列の特定の要素を更新
また、フィルタリングされた位置演算子 とともに arrayFilters パラメーターを使用して、パターンに一致する特定の配列要素を更新することもできます。
次の例では、writers 配列を持つ既存のコレクションの「GODFAther」という映画を使用します。この操作では、サフィックスを追加して、名前に「スクリーンショット」が含まれるライターのみを更新します。
db.movies.update( { title: "The Godfather" }, { $set: { "writers.$[elem]" : { $concat: [ "$elem", " - UPDATED" ] } } }, { arrayFilters: [ { "elem": { $regex: /screenplay/ } } ] } )
この操作は"The Gofther"ドキュメントを対象とし、フィルター条件に一致する配列要素のみを更新します。操作の後、スクリーンショットを担当したライターには「-UPDATED」が追加されます。
更新操作に hint を指定する
hintオプションは、MongoDB が更新操作に使用するインデックスを指定します。複数のドキュメントを更新する場合は、インデックスを指定してコンシステントなクエリプランを確保します。この例では、sample_mflix データベースの既存のmoviesコレクションを使用します。
まず、yearフィールドにインデックスを作成します。
db.movies.createIndex( { year: 1 } )
The following update operation explicitly hints to use the { year: 1 } index to update all movies from 2010-2015:
db.movies.update( { year: { $gte: 2010, $lte: 2015 } }, // Query parameter { $set: { decade: "2010s" } }, // Update document { multi: true, hint: { year: 1 } } // Options )
注意
存在しないインデックスを指定した場合、操作はエラーになります。
使用されたインデックスを確認するには、次の操作で explain を実行します。
db.movies.explain().update( { title: "The Godfather", year: { $gte: 1970 } }, { $set: { test_hint_field: true } }, { hint: { year: 1 } } )
db.collection.explain().update()はドキュメントを変更しません。
変数の使用 let
バージョン 5.0 の新機能。
コマンド内の他の場所からアクセスできる変数を定義するには、 letオプションを使用します。
注意
変数を使用して結果をフィルタリングするには、$expr 演算子内の変数にアクセスする必要があります。
例:
letオプションで 2 つの変数を定義します:targetTitle(「Atlas マトリクス」に設定)とnewTitle(「Atlas Reloaded」に設定)クエリフィルターで
$exprを使用して、ドキュメントのtitleフィールドと$$targetTitle変数を比較します$setで集計パイプラインを使用して、titleフィールドを$$newTitleの値に更新します
db.movies.update( { $expr: { $eq: [ "$title", "$$targetTitle" ] } }, [ { $set: { sequel: "$$sequelTitle" } } ], { let : { targetTitle: "The Matrix", sequelTitle: "The Matrix Reloaded" } } )
デフォルトの書込み保証 (write concern) の上書き
次のレプリカセットに対する操作では、w: 2 の書込み保証 (write concern)を指定し、タイムアウトを wtimeout で5000 ミリ秒に設定しています。この操作は、書き込み (write) がプライマリと1つのセカンダリの両方に伝達された後に返すか、5 秒後にタイムアウトします。
db.movies.update( { num_mflix_comments: { $lte: 10 } }, { $set: { featured: true } }, { multi: true, writeConcern: { w: 2, j: true, wtimeout: 5000 } } )
w: 2 で指定されたプライマリと少なくとも 1 つのセカンダリによって書き込み (write) が確認された後に、操作は正常に完了します。
シャーディングされたクラスターでの書込み保証 (write concern) エラー
バージョン8.1.2で変更。
db.collection.update() がシャーディングされたクラスター内の mongos で実行されると、他のエラーが 1 つ以上発生した場合でも、レスポンスには常に writeConcernError が報告されます。以前のリリースでは、他のエラーによって db.collection.update() が書込み保証 (write concern)エラーを報告しないことがあります。
例、ドキュメントが検証に失敗して DocumentValidationFailed エラーが発生し、書込み保証 (write concern)エラーも発生した場合、DocumentValidationFailed エラーと writeConcernError の両方が応答の最上位フィールドに返されます。
照合の指定
任意。操作に使用する照合を指定します。
照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。
照合オプションの構文は次のとおりです。
collation: { locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> }
照合を指定する場合、locale フィールドは必須ですが、その他の照合フィールドはすべて任意です。フィールドの説明については、照合ドキュメントを参照してください。
照合が指定されていなくても、コレクションにデフォルトの照合が設定されている場合(db.createCollection() を参照)には、コレクションの照合が使用されます。
コレクションにも操作にも照合が指定されていない場合、MongoDB では以前のバージョンで使用されていた単純なバイナリ比較によって文字列が比較されます。
1 つの操作に複数の照合は指定できません。たとえば、フィールドごとに異なる照合を指定できません。また、ソートと検索を一度に実行する場合、検索とソートで別の照合を使用できません。
この操作は、night で始まるタイトルを持つすべての映画を更新し、大文字と小文字を区別しない比較に strength: 1 を使用する
db.movies.update( { title: /^night/i }, { $set: { updated: true } }, { collation: { locale: "en", strength: 1 }, multi: true } )