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

db. コレクション.update()(mongoshメソッド)

重要

非推奨の mongosh メソッド

This method is deprecated in mongosh. For alternative methods, see Compatibility Changes with Legacy mongo Shell.

db.collection.update(query, update, options)

既存のドキュメント、またはコレクション内のドキュメントを変更します。このメソッドは、update パラメータに応じて、既存のドキュメントの特定のフィールドを変更したり、既存のドキュメント全体を置き換えたりできます。

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 はクラウドでの 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
タイプ
説明

ドキュメント

更新の選択基準。find()メソッドと同じクエリ セレクターを使用できます。

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.

ドキュメントまたはパイプライン

適用される変更内容。次のいずれかになります。

更新演算子式のみが含まれます。

<field1>: <value1> ペアのみが含まれています。

次の集計ステージのみが含まれます。

詳細と例については、「Oplog エントリ」を参照してください。

ブール値

Optional. When true, update() either:

  • query に一致するドキュメントがない場合は、新しいドキュメントを作成します。詳細については、「アップサートの動作」を参照してください。

  • query に一致する 1 つのドキュメントをアップデートします。

upsertmulti の両方が true であり、クエリに一致するドキュメントがない場合、アップデート操作によって 1 つのドキュメントのみが挿入されます。

複数のアップサートを回避するため、query フィールドにユニークインデックスが付けられていることを確認します。例については、「重複した値を使用したアップサート」を参照してください。

デフォルトは false で、一致するものが見つからなくても新しいドキュメントは挿入されません

ブール値

Optional. If set to true, updates multiple documents that meet the query criteria. If set to false, updates one document. The default value is false. For additional information, see Update Multiple Documents Examples.

ドキュメント

任意。書込み保証 (write concern) を表現するドキュメント。省略すると、デフォルトの書込み保証 (write concern) w: "majority" が使用されます。

トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。

writeConcern の使用例については、「デフォルトの書込み保証 (write concern) の上書き」を参照してください。

ドキュメント

任意。

照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。

collation の使用例については、「「照合の指定」を参照してください。

配列

任意。配列フィールドの更新操作でどの配列要素を変更するかを決定するフィルター ドキュメントの配列。

In the update document, use the $[<identifier>] to define an identifier to update only those array elements that match the corresponding filter document in the arrayFilters.

識別子が更新ドキュメントに含まれていない場合、識別子の配列フィルター ドキュメントを作成することはできません。

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 hint for Update Operations.

ドキュメント

任意。

変数のリストを含むドキュメントを指定します。これにより、変数をクエリテキストから分離することで、コマンドの読みやすさを向上させることができます。

ドキュメントの構文は次のとおりです。

{
<variable_name_1>: <expression_1>,
...,
<variable_name_n>: <expression_n>
}

変数は式によって返された値に設定され、その後は変更できません。

コマンド内の変数の値にアクセスするには、二重ドル記号の接頭辞($$)を $$<variable_name> 形式にした変数名とともに使用します。たとえば次のとおりです。$$targetTotal

結果のフィルタリングに変数を使用するには、$expr 演算子内の変数にアクセスする必要があります。

For a complete example using let and variables, see Use Variables in let.

integer

任意。タイムアウトするまでに更新操作を実行する時間制限をミリ秒単位で指定します。

ブール値

オプション。insert を有効にすると、操作中にスキーマ検証をバイパスできます。これにより、検証要件を満たさないドキュメントを挿入できるようになります。

このメソッドは、操作のステータスを含む WriteResult ドキュメントを返します。

authorizationを使用して実行されている配置では、ユーザーには次の特権を含むアクセス権が必要です。

  • update 指定したコレクションに対するアクション。

  • find 指定したコレクションに対するアクション。

  • insert 操作の結果がアップサートになる場合、指定されたコレクションに対して実行されるアクション。

組み込みロール readWrite は必要な特権を提供します。

multi: true を設定した場合、update() メソッドは冪等演算にのみ使用してください。

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 つのシャードに絞り込めない場合は、置き換えドキュメントで絞り込もうとします。

以前のバージョンでは、この操作では置換ドキュメントを使用するターゲットを試行します。

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()既存のシャードキー値を変更するには:

Tip

欠落しているキー値は NULL 等価一致の一部として返されるため、NULL 値のキーが更新されないように、必要に応じて追加のクエリ条件(_id フィールドなど)を追加します。

See also upsert on a Sharded Collection.

シャーディングされたコレクション内のドキュメントには、シャードキー フィールドがない場合がありますdb.collection.update()を使用してドキュメントの 欠落している シャードキーを設定するには、 で実行するmongos 必要があります 。シャードに対して直接操作を実行しないでください

さらに、次の要件も適用されます。

タスク
要件

設定するには null

  • multi: true を指定できます。

  • upsert: trueの場合は、シャード キー全体に等価フィルターが必要です。

null以外の値に設定するには

  • トランザクション 内で、または再試行可能な書き込みとして実行する必要があります

  • 必ずmulti: falseを指定します。

  • 次のいずれかの場合、完全なシャードキーに等価フィルターが必要です。

    • upsert: trueまたは、

    • 置換ドキュメントを使用しており、新しいシャードキー値が別のシャードに属している場合。

Tip

欠落しているキー値は NULL 等価一致の一部として返されるため、NULL 値のキーが更新されないように、必要に応じて追加のクエリ条件(_id フィールドなど)を追加します。

以下も参照してください。

db.collection.update()分散トランザクション内で使用できます。

重要

ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。

トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。

トランザクションがクロスシャード間書き込みトランザクション(write transaction)でない場合に、分散トランザクション内にコレクションとインデックスを作成できます。

db.collection.update() upsert: true は、既存のコレクションまたは存在しないコレクションで実行できます。存在しないコレクションで実行すると、操作によってコレクションが作成されます。

トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。

db.collection.update() 操作によって 1 つ以上のドキュメントが正常に更新されると、その操作によって oplog(操作ログ)にエントリーが追加されます。操作が失敗した場合、または更新するドキュメントが見つからなかった場合は、その操作によって oplog にエントリーが追加されることはありません。

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()操作で新しいものを正常に挿入します。
    ドキュメント。
  • その他の db.collection.update() 操作は、新しく挿入された

    ドキュメントまたは、一意なキーの競合が原因で失敗します。

    新しく挿入されたドキュメントを更新するための他の db.collection.update() 操作では、次の条件が すべて 満たされている必要があります。

    • ターゲットコレクションにユニークインデックスがあると、
      重複キー エラー。
    • 更新操作がupdateMany ではない、または multi
      false.
    • アップデートの一致条件は、次のいずれかです。

      • 単一の等価述語。例: { "fieldA" : "valueA" }

      • 等価述語の論理 AND。例: { "fieldA" : "valueA", "fieldB" : "valueB" }

    • 等価述語内のフィールドが次内のフィールドと一致
      ユニークインデックスキー パターン。
    • 更新操作が、 内のフィールドを変更しない。
      ユニークインデックスキー パターン。

アップデート ドキュメントでは、$[<identifier>] フィルター処理された位置演算子を使用して識別子を定義し、配列フィルター ドキュメントで参照します。識別子がアップデートドキュメントに含まれていない場合、識別子の配列フィルタードキュメントを作成することはできません。

<identifier>は小文字で始まり、含めることができるのは英数字のみです。

アップデートドキュメントには同じ識別子を複数回含めることができます。ただし、 更新ドキュメント内の個別の識別子 ($[identifier]) それぞれに対し、対応する配列フィルタードキュメント を1 つだけ 指定する必要があります。つまり、同じ識別子に対して複数の配列フィルター ドキュメントを指定することはできません。ただし、単一のフィルタードキュメント内の同じ識別子に複合条件を指定できます

注意

arrayFilters は、集計パイプラインが使用される更新では使用できません。

db.collection.update() メソッドは、操作のステータスを含む WriteResult() オブジェクトを返します。成功すると、WriteResult() オブジェクトには、クエリ条件に一致したドキュメントの数、更新によって挿入されたドキュメントの数、および変更されたドキュメントの数が含まれます。

db.collection.update() メソッドで書込み保証 (write concern) エラーが発生した場合、結果には WriteResult.writeConcernError フィールドが含まれます。

次の表は、WriteResult.writeConcernError.provenanceの値について説明したものです。

出所
説明

clientSupplied

書き込み保証(write concern)がアプリケーションで指定されました。

customDefault

書込み保証 (write concern) は、カスタム定義されたデフォルト値に基づきます。setDefaultRWConcern を参照してください。

getLastErrorDefaults

書込み保証 (write concern) は、レプリカセットの settings.getLastErrorDefaults のフィールドに基づきます。

implicitDefault

他の書き込み保証(write concern)が一切指定されていない状態で、サーバーから発生した書き込み保証。

db.collection.update() メソッドで書込み保証以外のエラーが発生した場合、結果には WriteResult.writeError フィールドが含まれます。

このページの例では、sample_mflixサンプルデータセットのデータを使用します。このデータセットを自己管理型MongoDB配置にロードする方法の詳細については、サンプルデータセットをロードする を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。

<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 に設定します。

次の操作では、$push 更新演算子を使用して genres 配列に値を追加します。

db.movies.update(
{ title: "The Matrix" },
{
$push: { genres: "Thriller" }
}
)

更新後、genres 配列には新しい値が含まれます。

次の操作では、$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フィールドは削除されます。

multitrue に設定されている場合、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

$set

アップサート: 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 }
)

<query> パラメーターに一致するドキュメントがない場合、更新操作、置換ドキュメントのみを含むドキュメントが挿入されます。置換ドキュメントまたは クエリドキュメントでは _idフィールドが指定されていないため、操作新しいドキュメントの _idフィールドに一意の ObjectId が作成されます。操作の WriteResult に反映される upsert が確認できます。

クエリ条件に一致するドキュメントがなく、<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
)

クエリ条件に一致するドキュメントがない場合、操作は対応するドキュメントを挿入します。

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

集計パイプラインを使用した更新の追加例については、集約パイプラインを使用した更新を参照してください。

次の操作では、multi オプションと upsert オプションの両方を指定します。一致するドキュメントが存在する場合、この操作により一致するすべてのドキュメントが更新されます。一致するドキュメントが存在しない場合は、この操作によって新しいドキュメントが挿入されます。

db.movies.update(
{ title: { $in: ["The Godfather", "The Matrix"] } },
{ $set: { test_upsert_field: true } },
{ upsert: true, multi: true }
)

両方の映画がコレクションに存在するため、操作は一致するドキュメントの両方を更新します。

コレクションに一致するドキュメントがない場合、この操作を行うと、<query><update> の両方の仕様のフィールドを使用して単一のドキュメントが挿入されます。例えば、次の操作について考えてみましょう。

db.movies.update(
{ "title": "Test Movie Unique789" },
{ $set: { year: 2024, type: "movie" } },
{ upsert: true, multi: true }
)

この操作は、対応するドキュメントを moviesコレクションに挿入します。

db.collection.update() メソッドでは、実行する変更を指定する 集計パイプライン [ <stage1>, <stage2>, ... ] を受け入れることができます。パイプラインは次のステージで構成できます。

集計パイプラインを使用すると、現在のフィールド値に基づいて条件付きのアップデートを表現したり、あるフィールドを他のフィールドの値を使用してアップデートするなど、より表現内容の多いアップデート ステートメントが可能になります。

次の例では、これらの操作を実行する集計パイプラインと、映画のタイトルと年を組み合わせた displayTitleフィールドを作成します。

  • は、title フィールドと year フィールドを連結して displayTitleフィールドを作成します

  • lastModified タイムスタンプを設定する

db.movies.update(
{ title: "The Godfather" },
[
{ $set: {
displayTitle: { $concat: [ "$title", " (", { $toString: "$year" }, ")" ] },
lastModified: "$$NOW"
}
}
]
)

次の例では、 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は、アップデートオペレーターの $set ではなく、集計ステージ $setを参照します。

$set段階:

  • は、 IMDB 評価(10 でスケーリング)と ユーザー評価(10 でスケーリング)を平均化して新しいフィールドcombinedScore を計算し、小数点以下桁に丸めます。詳しくは、$avg$multiply、および $round を参照してください。

  • フィールドlastUpdateを集計変数NOWの値に設定します。

  • combinedScore に基づいて、$switch 演算子を使用してレターグレードを割り当てます。

指定された条件に一致するすべての配列要素を更新するには、 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オプションは、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()はドキュメントを変更しません。

バージョン 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" } }
)

次のレプリカセットに対する操作では、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) が確認された後に、操作は正常に完了します。

バージョン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
}
)