Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Docs Menu
Docs Home
/ /

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

重要

非推奨の mongosh メソッド

このメソッドは mongoshでは非推奨です。 別のメソッドについては、「レガシーmongo shellとの互換性の変更 」を参照してください。

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
タイプ
説明

ドキュメント

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

とともにupdate() upsert: trueを実行し、クエリが既存のドキュメントと一致しない場合、クエリがドット表記を使用して フィールドに条件を指定すると、 MongoDB_id は新しいドキュメントの挿入を拒否します。

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

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

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

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

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

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

ブール値

任意。 trueの場合、update() は次のいずれかになります。

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

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

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

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

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

ブール値

任意。 true に設定すると、 は query 条件を満たす複数のドキュメントを更新します。 false に設定されていると、 は 1 つのドキュメントを更新します。 デフォルト値は false です。 詳細については、「 複数のドキュメントの更新例 」を参照してください。

ドキュメント

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

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

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

ドキュメント

任意。

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

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

配列

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

アップデートドキュメントでは、 $[<identifier>]を使用して、arrayFilters 内の対応するフィルタードキュメントと一致する配列要素のみをアップデートするための識別子を定義します。

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

例については、配列更新操作を参照してください。

ドキュメントまたは文字列

任意。 クエリ述語をサポートするために使用するインデックスを指定するドキュメントまたは string です。

このオプションには、インデックス仕様ドキュメントまたはインデックス名の文字列を指定できます。

存在しないインデックスを指定した場合、操作はエラーになります。

例については、「 hint更新操作での の指定 」を参照してください。

ドキュメント

任意。

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

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

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

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

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

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

letと変数を使用した完全な例については、「 における変数の使用 let」を参照してください。

integer

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

ブール値

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

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

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

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

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

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

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

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

$expr 演算子を使用して upsert フラグを true に設定しようとすると、エラーが発生します。

シャーディングされたコレクションで db.collection.update()multi: false と一緒に使用するには、_id フィールドに完全一致を含めるか、単一のシャードをターゲットにする(シャードキーを含めるなど)必要があります。

db.collection.update() が更新操作(ドキュメント置換操作ではない)を実行する場合、db.collection.update() では複数のシャードをターゲットにすることができます。

Tip

ドキュメント置き換え操作では、まずクエリフィルターを使用して 1 つのシャードに対象を絞り込もうとします。クエリフィルターで 1 つのシャードに絞り込めない場合は、置き換えドキュメントで絞り込もうとします。

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

upsert: true を含み、かつシャーディングされたコレクションにある db.collection.update() の操作には、filter に完全なシャードキーを含める必要があります。

  • 更新操作に使用します。

  • ドキュメントの置き換え操作用。

ただし、シャーディングされたコレクション内のドキュメントにはシャードキーのフィールドがない場合があります。シャードキーがないドキュメントを対象とするには、null を等価一致の を(_id フィールド上と同じに)別のフィルター条件と組み合わせて使用できます。以下に例を挙げます。

{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key

シャードキー フィールドが不変の _id フィールドでない限り、ドキュメントのシャードキー値を更新できます。

既存のシャードキー値をdb.collection.update()で変更するには

Tip

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

シャーディングされたコレクションの upsert」も参照してください。

シャーディングされたコレクション内のドキュメントには、シャードキー フィールドがない場合があります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 にエントリーが追加されることはありません。

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()操作で新しいものが正常に挿入されます
    ドキュメント。
  • その他の 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() メソッドで 以外の書込み保証(書込み保証 (write concern)エラーが発生した場合、結果には 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')
*/

この操作、一致する両方のドキュメントが更新されます。

置換を実行し、更新ドキュメントに field:value の式のみが含まれている場合は、multi: true を指定できません。

Tip

オプションupsert: trueを指定した場合

シャーディングされたコレクションで 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 が確認できます。

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

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

<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

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

次の操作では、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
}
)

戻る

db.collection.unhideIndex

項目一覧