定義
db.collection.update(query, update, options)既存のドキュメント、またはコレクション内のドキュメントを変更します。このメソッドは、update パラメータに応じて、既存のドキュメントの特定のフィールドを変更したり、既存のドキュメント全体を置き換えたりすることができます。
デフォルトでは、
db.collection.update()メソッドは 単一のドキュメントを更新します。クエリ条件に一致するすべてのドキュメントを更新するには、オプション multi: true を含めます。
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
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 | タイプ | 説明 | ||||||
|---|---|---|---|---|---|---|---|---|
ドキュメント | 更新の選択基準。 とともに | |||||||
ドキュメントまたはパイプライン | 適用される変更内容。次のいずれかになります。
詳細と例については、 「 oplogエントリ 」を参照してください。 | |||||||
ブール値 | 任意。
複数の デフォルトは | |||||||
ブール値 | 任意。 | |||||||
ドキュメント | 任意。書込み保証 (write concern) を表現するドキュメント。省略すると、デフォルトの書込み保証 (write concern) トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。
| |||||||
ドキュメント | ||||||||
配列 | 任意。配列フィールドの更新操作でどの配列要素を変更するかを決定するフィルター ドキュメントの配列。 アップデートドキュメントでは、 識別子が更新ドキュメントに含まれていない場合、識別子の配列フィルター ドキュメントを作成することはできません。 例については、配列更新操作を参照してください。 | |||||||
ドキュメントまたは文字列 | 任意。 クエリ述語をサポートするために使用するインデックスを指定するドキュメントまたは string です。 このオプションには、インデックス仕様ドキュメントまたはインデックス名の文字列を指定できます。 存在しないインデックスを指定した場合、操作はエラーになります。 例については、「 | |||||||
ドキュメント | 任意。 変数のリストを含むドキュメントを指定します。これにより、変数をクエリテキストから分離することで、コマンドの読みやすさを向上させることができます。 ドキュメントの構文は次のとおりです。 変数は式によって返された値に設定され、その後は変更できません。 コマンド内の変数の値にアクセスするには、二重ドル記号の接頭辞( 結果のフィルタリングに変数を使用するには、
| |||||||
integer | 任意。タイムアウトするまでに更新操作を実行する時間制限をミリ秒単位で指定します。 | |||||||
ブール値 | オプション。 |
戻り値
このメソッドは、操作のステータスを含む WriteResult ドキュメントを返します。
アクセス制御
authorizationを使用して実行されている配置では、ユーザーには次の特権を含むアクセス権が必要です。
update指定したコレクションに対するアクション。find指定したコレクションに対するアクション。insert操作の結果がアップサートになる場合、指定されたコレクションに対して実行されるアクション。
組み込みロール readWrite は必要な特権を提供します。
動作
制限
multi: true を設定した場合、update() メソッドは冪等演算にのみ使用してください。
$exprを使用した更新で を使用するUpsert
$expr 演算子を使用して upsert フラグを true に設定しようとすると、エラーが発生します。
シャーディングされたコレクション
シャーディングされたコレクションで db.collection.update() を multi: false と一緒に使用するには、_id フィールドに完全一致を含めるか、単一のシャードをターゲットにする(シャードキーを含めるなど)必要があります。
db.collection.update() が更新操作(ドキュメント置換操作ではない)を実行する場合、db.collection.update() では複数のシャードをターゲットにすることができます。
シャーディングされたコレクションでドキュメント操作を置換する
ドキュメント置き換え操作では、まずクエリフィルターを使用して 1 つのシャードに対象を絞り込もうとします。クエリフィルターで 1 つのシャードに絞り込めない場合は、置き換えドキュメントで絞り込もうとします。
以前のバージョンでは、この操作では置換ドキュメントを使用するターゲットを試行します。
upsert シャーディングされたコレクション
upsert: true を含み、かつシャーディングされたコレクションにある db.collection.update() の操作には、filter に完全なシャードキーを含める必要があります。
更新操作に使用します。
ドキュメントの置き換え操作用。
ただし、シャーディングされたコレクション内のドキュメントにはシャードキーのフィールドがない場合があります。シャードキーがないドキュメントを対象とするには、null を等価一致の を(_id フィールド上と同じに)別のフィルター条件と組み合わせて使用できます。以下に例を挙げます。
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
シャードキーの変更
シャードキー フィールドが不変の _id フィールドでない限り、ドキュメントのシャードキー値を更新できます。
既存のシャードキー値をdb.collection.update()で変更するには
必ず
mongos上で使用します。シャードに直接操作を実行しないでください。トランザクション内で、または 再試行可能な書き込みとして実行する必要があります。
必ず
multi: falseを指定します。完全なシャードキーに等価のクエリフィルターを含める必要があります。
Tip
欠落しているキー値は NULL 等価一致の一部として返されるため、NULL 値のキーが更新されないように、必要に応じて追加のクエリ条件(_id フィールドなど)を追加します。
「シャーディングされたコレクションの upsert」も参照してください。
欠落しているシャードキー
シャーディングされたコレクション内のドキュメントには、シャードキー フィールドがない場合があります。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 クエリによるアップサート
upsert:
true を指定してupdate() を実行して、クエリが既存のドキュメントと一致しない場合、クエリがドット表記を使用して _id フィールドに条件を指定すると、MongoDB は新しいドキュメントの挿入を拒否します。
この制限により、_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() メソッドで 以外の書込み保証(書込み保証 (write concern)エラーが発生した場合、結果には 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フィールドは削除されます。
複数のドキュメントを更新($update と multi)
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') */
この操作、一致する両方のドキュメントが更新されます。
置換を実行し、更新ドキュメントに field:value の式のみが含まれている場合は、multi: true を指定できません。
Tip
一致するものが存在しない場合は新しいドキュメントを挿入する(Upsert)
オプションupsert: trueを指定した場合
ドキュメントがクエリ条件に一致する場合、
db.collection.update()は更新を実行します。クエリ条件に一致するドキュメントがない場合、
db.collection.update()は 1 つのドキュメントを挿入します。注意
複数の同一のアップサートがほぼ同時に発行されると、upsert: true で使用される
update()によって重複したドキュメントが作成される可能性があります。詳細については、「重複した値を使用したアップサート」を参照してください。
シャーディングされたコレクションで upsert: true を指定する場合、filter には完全なシャードキーを含める必要があります。シャーディングされたコレクションにおける追加のdb.collection.update()動作については、シャーディングされたコレクションを参照してください。
次のタブでは、update() を使用したupsert 修飾子のさまざまな使用方法を紹介します。
置換ドキュメントのアップサート
クエリ条件に一致するドキュメントがなく、<update> パラメーターが置換ドキュメント(フィールドと値のペアのみを含むドキュメント)の場合、更新により、置換ドキュメントのフィールドと値を含む新しいドキュメントが挿入されます。
クエリ パラメーターまたは置換ドキュメントのいずれかに
_idフィールドを指定した場合、MongoDB は、挿入されるドキュメントでその_idフィールドを使用します。クエリ パラメーターまたは置換ドキュメントのいずれにも
_idフィールドを指定しない場合、MongoDB は、ランダムに生成された ObjectId 値を持つ_idフィールドを追加します。クエリ パラメーターと置換ドキュメントで異なる
_idフィールド値を指定することはできません。指定すると、操作はエラーを返します。
例えば、次の更新では、アップサート オプションが true に設定されます。
db.movies.update( { title: "Test Movie 12345" }, { $set: { title: "Test Movie 12345", year: 2024, genres: [ "Documentary" ], rated: "NR" } }, { upsert: true } )
<query> パラメーターに一致するドキュメントがない場合、更新操作、置換ドキュメントのみを含むドキュメントが挿入されます。置換ドキュメントまたは クエリドキュメントでは _idフィールドが指定されていないため、操作新しいドキュメントの _idフィールドに一意の ObjectId が作成されます。操作の WriteResult に反映される upsert が確認できます。
演算子式を使用したアップサート($set)
クエリ条件に一致するドキュメントがなく、<update> パラメーターが更新演算子式を含むドキュメントである場合、この操作はでは、<query> パラメーターの等価句から基本ドキュメントを作成し、<update> パラメーターの式を適用します。
<query>からの比較操作は新しいドキュメントに含まれません。 新しいドキュメントに_idフィールドが含まれていない場合、MongoDB はObjectId値を持つ_idフィールドを追加します。
例えば、次の更新では、アップサート オプションが true に設定されます。
db.movies.update( { title: "Test Movie 67890" }, // Query parameter { // Update document $set: { rated: "PG" }, $setOnInsert: { year: 2024, type: "movie" } }, { upsert: true } // Options )
クエリ条件に一致するドキュメントがない場合、操作は対応するドキュメントを挿入します。
Tip
集計パイプラインを使用したアップサート
<update> パラメーターが 集計パイプライン の場合、更新により、<query> パラメーターの等価句から基本ドキュメントを作成し、そのドキュメントにパイプラインを適用して挿入するドキュメントを作成します。新しいドキュメントに _id フィールドが含まれていない場合、MongoDB は ObjectId 値を持つ _id フィールドを追加します。
例、次の集計パイプラインでは、クエリフィルターに一致する既存のドキュメントが存在しないため、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
集計パイプラインを使用した更新の追加例については、集約パイプラインを使用した更新を参照してください。
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段階:
は、 IMDB 評価(10 でスケーリング)と ユーザー評価(10 でスケーリング)を平均化して新しいフィールド
combinedScoreを計算し、小数点以下桁に丸めます。詳しくは、$avg、$multiply、および$roundを参照してください。フィールド
lastUpdateを集計変数NOWの値に設定します。combinedScoreに基づいて、$switch演算子を使用してレターグレードを割り当てます。
Tip
配列更新操作に arrayFilters を指定する
arrayFilters 条件に一致する要素を更新する
指定された条件に一致するすべての配列要素を更新するには、 arrayFiltersパラメーターを使用します。
次の例では、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 } )
次の更新操作は、ヒントを使用して { year: 1 }インデックスを使用して 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 } )