定義
updateupdateコマンドは、コレクション内のドキュメントを変更します。 単一のupdateコマンドに複数のアップデート ステートメントを含めることができます。Tip
mongoshでは、このコマンドは 、updateOne()、updateMany()、replaceOne()、findOneAndReplace()、およびヘルパー メソッドfindOneAndUpdate()を通じて実行することもできます。ヘルパー メソッドは
mongoshユーザーには便利ですが、データベースコマンドと同じレベルの情報は返されない可能性があります。 便宜上必要ない場合、または追加の戻りフィールドが必要な場合は、 データベースコマンドを使用します。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
バージョン8.0で変更。
このコマンドの構文は、次のとおりです。
db.runCommand( { update: <collection>, updates: [ { q: <query>, u: <document or pipeline>, c: <document>, // Added in MongoDB 5.0 upsert: <boolean>, multi: <boolean>, collation: <document>, arrayFilters: <array>, hint: <document|string>, sort: <document> }, ... ], ordered: <boolean>, maxTimeMS: <integer>, writeConcern: { <write concern> }, bypassDocumentValidation: <boolean>, comment: <any>, let: <document> // Added in MongoDB 5.0 } )
コマンドフィールド
このコマンドは、次のフィールドを使用します。
フィールド | タイプ | 説明 | |||||
|---|---|---|---|---|---|---|---|
| string | ターゲット コレクションの名前。 | |||||
| 配列 | 名前付きコレクションに対して実行する 1 つ以上のアップデート ステートメントの配列。 更新 ステートメントの詳細については、「 更新 ステートメント 」を参照してください。 | |||||
| ブール値 | オプション。 | |||||
| non-negative integer | 任意。 時間制限をミリ秒単位で指定します。 MongoDB は、 | |||||
| ドキュメント | 任意。 コマンドの トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。 | |||||
| ブール値 | 任意。 | |||||
| any | 任意。このコマンドに添付するユーザー指定のコメント。設定すると、このコメントは以下の場所にこのコマンドの記録と合わせて表示されます。
コメントには、有効な BSON 型(string, integer, object, array など)を使用できます。 | |||||
ドキュメント | 任意。 変数のリストを含むドキュメントを指定します。これにより、変数をクエリテキストから分離することで、コマンドの読みやすさを向上させることができます。 ドキュメントの構文は次のとおりです。 変数は式によって返された値に設定され、その後は変更できません。 コマンド内の変数の値にアクセスするには、二重ドル記号の接頭辞( 完全な例については、「 オプションまたは フィールドで変数を使用する バージョン 5.0 で追加 | ||||||
| ドキュメント | 任意。 更新が適用される前にドキュメントを並べ替えます。 ソート引数がドキュメントでない場合、操作はエラーになります。 MongoDB では、コレクション内のドキュメントを特定の順序で保存することはありません。重複する値を含むフィールドでソートする場合、それらの値を含むドキュメントは任意の順序で返されます。
ソート条件で指定されたフィールドが2つのドキュメントに存在しない場合、それらがソートされる値は同じです。2つのドキュメントは、任意の順序で返される可能性があります。 一貫したソート順序が必要な場合は、一意の値を含むフィールドを少なくとも 1 つ含めてソートしてください。これを保証する最も簡単な方法は、 詳細については、「ソートの整合性」を参照してください。 バージョン8.0の新機能。
|
アップデート ステートメント
updates配列の各要素は、アップデート ステートメント ドキュメントです。各ドキュメントには、次のフィールドが含まれています。
フィールド | タイプ | 説明 | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ドキュメント | ||||||||||||||||||||
ドキュメントまたはパイプライン | 適用される修正。値は次のいずれかになります。
詳細については、「 動作 」を参照してください。 | |||||||||||||||||||
ドキュメント | 任意。 変数のリストを含むドキュメントを指定します。これにより、変数をクエリテキストから分離することで、コマンドの読みやすさを向上させることができます。 ドキュメントの構文は次のとおりです。 変数は式によって返された値に設定され、その後は変更できません。 コマンド内の変数の値にアクセスするには、二重ドル記号の接頭辞( 結果のフィルタリングに変数を使用するには、
バージョン 5.0 で追加 | |||||||||||||||||||
ブール値 | 任意。
複数の デフォルトは | |||||||||||||||||||
| ブール値 | オプション。 複数のドキュメントを更新する場合、1 つのドキュメントが更新に失敗すると、それ以降のドキュメントは更新されません。 この動作の詳細については、「 Multi更新の失敗 」を参照してください。 | ||||||||||||||||||
| ドキュメント | 任意。 操作に使用する照合を指定します。 照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。 照合オプションの構文は次のとおりです。 照合を指定する場合、 照合が指定されていなくても、コレクションにデフォルトの照合が設定されている場合( コレクションにも操作にも照合が指定されていない場合、MongoDB では以前のバージョンで使用されていた単純なバイナリ比較によって文字列が比較されます。 1 つの操作に複数の照合は指定できません。たとえば、フィールドごとに異なる照合を指定できません。また、ソートと検索を一度に実行する場合、検索とソートで別の照合を使用できません。 | ||||||||||||||||||
| 配列 | オプション。配列フィールドのアップデート操作でどの配列要素を変更するかを決定するフィルタードキュメントの配列。 アップデート ドキュメントでは、
アップデート ドキュメントには同じ識別子を複数回含めることができます。ただし、アップデート ドキュメント内の個別の識別子 ( ただし、次の例のように、単一のフィルター ドキュメント内の同じ識別子に複合条件を指定できます。 | ||||||||||||||||||
ドキュメントまたは文字列 | 任意。 クエリ述語をサポートするために使用するインデックスを指定するドキュメントまたは string です。 このオプションには、インデックス仕様ドキュメントまたはインデックス名の文字列を指定できます。 存在しないインデックスを指定した場合、操作はエラーになります。 例については、「 |
戻り値
このコマンドは、操作のステータスを含むドキュメントを返します。例:
{ "ok" : 1, "nModified" : 0, "n" : 1, "upserted" : [ { "index" : 0, "_id" : ObjectId("52ccb2118908ccd753d65882") } ] }
出力フィールドの詳細については、「出力」を参照してください。
アクセス制御
authorizationを使用して実行されている配置では、ユーザーには次の特権を含むアクセス権が必要です。
組み込みロール readWrite は必要な特権を提供します。
動作
制限
multi: true を設定した場合、update コマンドは冪等な操作にのみ使用してください。
更新演算子式ドキュメントを使用したアップデート
アップデートステートメントフィールド u は、 アップデート演算子式のみを含むドキュメントを受け入れることができます。例:
updates: [ { q: <query>, u: { $set: { status: "D" }, $inc: { quantity: 2 } }, ... }, ... ]
次に、 updateコマンドはドキュメント内の対応するフィールドのみを更新します。
置換ドキュメントによる更新
アップデート ステートメント フィールドuフィールドは置換ドキュメントを受け入れることができます。つまり、ドキュメントにはfield:value式のみが含まれます。 例:
updates: [ { q: <query>, u: { status: "D", quantity: 4 }, ... }, ... ]
次に、 updateコマンドは一致するドキュメントをアップデート ドキュメントに置き換えます。 updateコマンドは一致するドキュメントを1 つだけ置き換えることができます。つまり、 multiフィールドはtrueにできません。 updateコマンドは_id値を置き換えません。
Multi アップデートの失敗
multi パラメータがtrue に設定されたアップデートコマンドで 1 つのドキュメントのアップデートに失敗した場合、それ以上のドキュメントはそのコマンドの一部としてはアップデートされません。
例、sample_mflix.movies コレクションには フィールドを持つ映画が含まれています。imdb.rating moviesimdb.ratingの値が 以下であるというルールで、 コレクションにドキュメント検証を作成します。10
db.runCommand( { update: "movies", updates: [ { q: { year: { $gte: 2000, $lte: 2005 }, "imdb.rating": { $type: "number" } }, u: { $inc: { "imdb.rating": 1 } }, multi: true } ] } )
すでに評価が 10 になっている映画がある場合、増加させると検証ルール(評価は > 10)に違反します。こうした場合、数千のドキュメントがクエリに一致した場合でも更新は停止し、それ以上のドキュメントは更新されません。
注意
一致したドキュメントのサブセットが更新された場合、たとえば、更新によって一部のドキュメントがスキーマ検証に失敗する場合、update コマンドによって返される nModified の値は正確ではない可能性があります。
集計パイプラインによる更新
アップデート ステートメント フィールド u フィールドでは、集計パイプライン[ <stage1>, <stage2>, ... ]を受け入れて、実行する変更を指定できます。パイプラインは、次のステージで構成できます。
$addFieldsおよびそのエイリアス$set$replaceRootおよびそのエイリアス$replaceWith
集計パイプラインを使用すると、現在のフィールド値に基づいて条件付きのアップデートを表現したり、あるフィールドを他のフィールドの値を使用してアップデートするなど、より表現内容の多いアップデート ステートメントが可能になります。
以下に例を挙げます。
updates: [ { q: <query>, u: [ { $set: { status: "Modified", comments: [ "$misc1", "$misc2" ] } }, { $unset: [ "misc1", "misc2" ] } ], ... }, ... ]
例については、「集計パイプラインによる更新」を参照してください。
一意なインデックスを使用したアップサート
重複を防ぐためのユニークインデックスがない限り、アップサートによって重複したドキュメントが作成されることがあります。
Andy という名前のドキュメントが存在せず、複数のクライアントがほぼ同時に次のコマンドを発行する例を考えます。
db.runCommand( { update: "people", updates: [ { q: { name: "Andy" }, u: { $inc: { score: 1 } }, multi: true, upsert: true } ] } )
いずれかのクライアントがデータを正常に挿入する前にすべての update 操作がクエリ フェーズを終了し、かつ name フィールドにユニークインデックスがない場合、各 update 操作によって挿入が行われて、name: Andyを含む複数のドキュメントが作成される可能性があります。
name フィールドに一意なインデックスを設定すると、ドキュメントが 1 つだけ作成されるようになります。一意なインデックスが設定されると、複数の update 操作で次の動作が見られるようになります。
正確に 1 つの
update操作で新しいドキュメントが正常に挿入されます。その他の
update操作は、新しく挿入されたドキュメントを更新するか、一意なキーの競合が原因で失敗します。他の
update操作で新しく挿入されたドキュメントを更新するには、次の条件がすべて満たされている必要があります。ターゲット コレクションに一意なインデックスがあるため、重複キー エラーが発生。
更新操作が
updateManyではない、またはmultiがfalse。アップデートの一致条件は、次のいずれかです。
単一の等価述語。例:
{ "fieldA" : "valueA" }等価述語の論理 AND。例:
{ "fieldA" : "valueA", "fieldB" : "valueB" }
等価述語内のフィールドが、一意なインデックス キー パターン内のフィールドと一致。
更新操作が、一意なインデックス キー パターン内のフィールドを変更しない。
次の表に示す upsert 操作の例では、キーの衝突が発生した場合に更新されるか失敗します。
ユニークインデックスキーのパターン | アップデート操作 | 結果 | ||||||
|---|---|---|---|---|---|---|---|---|
| | マッチしたドキュメントの | ||||||
| | 一意なインデックス キー パターン( | ||||||
| | 等式述語フィールド( |
制限
updates 配列内の各アップデート要素について、クエリと更新サイズの合計(qおよびu )は、最大 BSON ドキュメント サイズ以下である必要があります。
updates 配列内の更新ステートメントの総数は、最大バルクサイズ以下である必要があります。
スキーマ検証
update コマンドは、bypassDocumentValidation オプションのサポートを追加します。これにより、検証ルールがあるコレクション内でドキュメントを挿入または更新する際に、スキーマ検証をバイパスできます。
シャーディングされたコレクション
upsert シャーディングされたコレクション
シャーディングされたコレクションでupdateをmulti: falseと併用するには、
upsert: trueを指定しない場合、フィルターqは
_idフィールドに等価一致を含めるか、単一のシャードをターゲットにする(シャードキーを含めるなど)必要があります。upsert: true を指定する場合、フィルターqにはシャードキーの等価一致が含まれている必要があります。
ただし、シャーディングされたコレクション内のドキュメントにはシャードキーのフィールドがない場合があります。シャードキーがないドキュメントを対象とするには、
nullを等価一致の を(_idフィールド上と同じに)別のフィルター条件と組み合わせて使用できます。以下に例を挙げます。{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
ドキュメントの置換
ドキュメントを置き換えるとき、 updateは最初にクエリフィルターを使用して、1 つのシャードをターゲットにしようとします。 クエリフィルターで単一のシャードをターゲットにできない場合は、置き換えドキュメントをターゲットにしようとします。
シャードキーの変更
シャードキー フィールドが不変の _id フィールドでない限り、ドキュメントのシャードキー値を更新できます。
既存のシャードキー値をupdateで変更するには
必ず
mongos上で使用します。シャードに直接操作を実行しないでください。トランザクション内で、または 再試行可能な書き込みとして実行する必要があります。
必ず
multi: falseを指定します。完全なシャードキーに等価のクエリフィルターを含める必要があります。
Tip
欠落しているキー値は NULL 等価一致の一部として返されるため、NULL 値のキーが更新されないように、必要に応じて追加のクエリ条件(_id フィールドなど)を追加します。
「シャーディングされたコレクションの upsert」も参照してください。
欠落しているシャードキー
シャーディングされたコレクション内のドキュメントには、シャードキー フィールドがない場合があります。updateを使用してドキュメントの欠落しているシャードキーを設定するには、mongosで実行する必要があります。シャードに対して直接操作を実行しないでください。
さらに、次の要件も適用されます。
タスク | 要件 |
|---|---|
設定するには |
|
|
|
Tip
欠落しているキー値は NULL 等価一致の一部として返されるため、NULL 値のキーが更新されないように、必要に応じて追加のクエリ条件(_id フィールドなど)を追加します。
以下も参照してください。
トランザクション
update は分散トランザクション内で使用できます。
重要
ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。
トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。
トランザクション内のアップサート
トランザクションがクロスシャード間書き込みトランザクション(write transaction)でない場合に、分散トランザクション内にコレクションとインデックスを作成できます。
update と upsert: trueは、既存のコレクションまたは存在しないコレクションで実行できます。存在しないコレクションに対して実行すると、操作によってコレクションが作成されます。
書込み保証とトランザクション
トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。
例
このページの例では、 sample_mflixサンプルデータセット のデータを使用します。このデータセットを自己管理型MongoDBデプロイにロードする 方法の詳細については、「サンプルデータセットをロードする 」を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
1 つのドキュメントの特定のフィールドのアップデート
アップデート演算子を使用して、ドキュメントの指定されたフィールドのみを更新します。
例、sample_mflixデータベースの moviesコレクション内のドキュメントには、title、year、num_mflix_comments などのフィールドが含まれています。
次のコマンドは、 $setおよび$incアップデート演算子を使用して、 titleが"The Godfather"に等しいドキュメントのyearフィールドとnum_mflix_commentsフィールドを更新します。
db.runCommand( { update: "movies", updates: [ { q: { title: "The Godfather" }, u: { $set: { year: 1972 }, $inc: { num_mflix_comments: 1 } } } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
<update>ドキュメントではオプションの multi フィールドが指定されていないため、q一致条件に一致するドキュメントが複数ある場合でも、更新によって変更されるのは 1 つのドキュメントのみです。
詳細については「出力」を参照してください。
1 つのドキュメントの特定のフィールドのアップデート
アップデート演算子を使用して、ドキュメントの指定されたフィールドのみを更新し、アップデート演算子に true に設定された multi フィールドを含めます。
例、sample_mflixデータベースの moviesコレクション内のドキュメントには、year や num_mflix_comments などのフィールドが含まれています。
次のコマンドは、$inc 更新演算子を使用して、num_mflix_comments でリリースされたすべての映画の1924 フィールドを増加させます。
db.runCommand( { update: "movies", updates: [ { q: { year: 1924 }, u: { $inc: { num_mflix_comments: 1 }, $set: { classic: true, era: "silent" } }, multi: true } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
multiフィールドが true に設定されているため、アップデートにより、qフィールドで指定されたクエリに一致するすべての 6 ドキュメントが変更され、次の出力が返されます。
{ n: 6, nModified: 6, ok: 1 }
詳細については「出力」を参照してください。
集約パイプラインによるアップデート
updateコマンドは、更新に集計パイプラインを使用できます。 このパイプラインには次のステージが含まれる可能性があります。
$addFieldsおよびそのエイリアス$set$replaceRootおよびそのエイリアス$replaceWith
集計パイプラインを使用すると、現在のフィールド値に基づいて条件付きのアップデートを表現したり、あるフィールドを他のフィールドの値を使用してアップデートするなど、より表現内容の多いアップデート ステートメントが可能になります。
例 1
次の例では、集計パイプラインを使用して、ドキュメント内の他のフィールドの値を使用してフィールドを変更します。
sample_mflixデータベースの usersコレクション内のドキュメントには、name や email などのフィールドが含まれています。
次の更新操作では、集計パイプラインを使用して特定のユーザーのドキュメントに新しいフィールドを追加します。
db.runCommand( { update: "users", updates: [ { q: { name: "Robert Baratheon" }, u: [ { $set: { full_info: { $concat: [ "$name", " - ", "$email" ] } } }, { $set: { status: "active" } } ], multi: false } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
注意
$setパイプラインで使用される 操作は、更新演算子 ではなく集計ステージ$set $setを参照します。
例 2
集計パイプラインを使用すると、現在のフィールド値に基づく条件付きアップデートを実行したり、アップデート時に別個のフィールド値の計算に現在のフィールド値を使用することができます。
sample_mflixデータベースの moviesコレクション内のドキュメントには yearフィールドがあります。
例の。
db.runCommand( { update: "movies", updates: [ { q: { title: "The Great Train Robbery" }, u: [ { $set: { age: { $subtract: [ 2026, "$year" ] } } }, { $set: { era: { $switch: { branches: [ { case: { $lt: [ "$year", 1960 ] }, then: "Classic" }, { case: { $lt: [ "$year", 1980 ] }, then: "Golden Age" }, { case: { $lt: [ "$year", 2000 ] }, then: "Modern" }, { case: { $gte: [ "$year", 2000 ] }, then: "Contemporary" } ], default: "Unknown" } } } } ], multi: false } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
一括アップデート
次の例では、既存のドキュメントの更新と新しいドキュメントの挿入の両方を行うために、1 つのコマンドで複数の更新操作を実行します。操作:
2015 の高評価のアクション映画を としてマークします
featuredは 2012 の短いタイトルの映画とロールの映画を として分類します
melodramaデータベースが存在しない場合は、2024 から新しいSF映画をアップサートします
db.runCommand( { update: "movies", updates: [ // Update highly-rated Horror movies from 2015 { q: { year: 2015, genres: "Horror", "imdb.rating": { $gte: 7 } }, u: { $set: { featured: true } }, multi: true }, // Update short Drama/Romance movies from 2012 { q: { year: 2012, genres: { $all: ["Drama", "Romance"] }, runtime: { $lt: 90 } }, u: { $set: { category: "melodrama" } }, multi: true }, // Upsert a new movie from 2026 { q: { title: "A New Movie", year: 2026 }, u: { $set: { genres: ["Sci-Fi", "Adventure"], runtime: 142, "imdb.rating": 8.5, featured: true } }, upsert: true } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
返されたドキュメントは、コマンドが既存のドキュメントを変更し、アップサートによって新しいドキュメントを挿入したことを示しています。詳細については、「 出力 」を参照してください。
{ n: 16, upserted: [ { index: 2, _id: ObjectId('69861e680e6ea1f51160fe1c') } ], nModified: 15, ok: 1, '...': '...' }
照合の指定
照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。
sample_mflixデータベースの moviesコレクション内のドキュメントには、title や year などのフィールドがあります。
次の操作では、照合を使用して、大文字と小文字を区別しない検索を実行します。クエリは小文字で "the godfather" を検索しますが、strength: 1 照合では、大文字と小文字に関係なく、クエリは "The Godfather" と一致します。
db.runCommand({ update: "movies", updates: [ { q: { title: "the godfather" }, u: { $set: { featured: true } }, collation: { locale: "en", strength: 1 } } ] })
arrayFilters配列更新操作に を指定する
配列フィールドを更新するときに、どの配列要素を更新するかを決定するためのarrayFiltersを指定できます。
arrayFilters条件に一致する要素を更新する
sample_mflixデータベースの moviesコレクション内のドキュメントには languages 配列フィールドがあります。
次の例では、languages 配列に "English" を含むすべての映画を更新します。この操作により、"English" は "EN" に置き換えられます。
db.runCommand( { update: "movies", updates: [ { q: { languages: "English" }, u: { $set: { "languages.$[element]" : "EN" } }, arrayFilters: [ { "element": "English" } ], multi: true} ] } )
ドキュメントの配列の特定の要素を更新する
sample_mflixデータベースの moviesコレクション内のドキュメントには、アクター名をリストする cast 配列があります。
次の例では、cast 配列に "Al Pacino" が含まれるすべての映画を更新し、"Al Pacino" を "REDACTED" に置き換えます。 arrayFilters オプションは、アップデートする配列要素を指定します。
db.runCommand({ update: "movies", updates: [ { q: { cast: "Al Pacino" }, u: { $set: { "cast.$[elem]" : "REDACTED" } }, arrayFilters: [ { "elem": "Al Pacino" } ], multi: true } ] })
この操作、cast 配列に "Al Pacino" を含むすべての 40 映画が更新され、その名前が "REDACTED" に置き換えられます。
hint更新操作に を指定する
sample_mflixデータベースの moviesコレクション内のドキュメントには、year や num_mflix_comments などのフィールドがあります。
コレクションに次のインデックスを作成します。
[ db.movies.createIndex( { year: 1 } ), db.movies.createIndex( { num_mflix_comments: 1 } ) ]
次のアップデート操作では、「Thegreat書式コレクション」のnum_mflix_commentsフィールドを増加させ、インデックス{ year: 1 }を使用することを明示的に示します。
注意
存在しないインデックスを指定した場合、操作はエラーになります。
db.runCommand({ update: "movies", updates: [ { q: { title: "The Great Train Robbery" }, u: { $inc: { "num_mflix_comments": 1 } }, hint: { year: 1 }, multi: false } ] })
使用されたインデックスを確認するには、 更新操作でexplain を実行します。例、次の例では、num_mflix_comments 5以降にリリースされたコメントが 以下の映画の2000 を増加させるアップデートについて説明しています。
db.runCommand( { explain: { update: "movies", updates: [ { q: { "num_mflix_comments": { $lte: 5 }, "year": { $gte: 2000 } }, u: { $inc: { "num_mflix_comments": 1 } }, hint: { year: 1 }, multi: true } ] }, verbosity: "queryPlanner" } )
explainはドキュメントを変更しません。
オプションまたは フィールドでの変数の使用letc
バージョン 5.0 で追加
変数はletオプションまたはcフィールドで定義し、 updates配列でアクセスできます。
注意
変数を使用して結果をフィルタリングするには、$expr 演算子内の変数にアクセスする必要があります。
sample_mflixデータベースの moviesコレクション内のドキュメントには、title や year などのフィールドがあります。
次の例では、let オプションを使用して、映画に新しいフィールドを検索して追加するための変数を定義します。
db.runCommand( { update: "movies", updates: [ { q: { $expr: { $eq: [ "$title", "$$movieTitle" ] } }, u: [ { $set: { franchise: "$$franchiseName" } } ] } ], let : { movieTitle: "The Godfather", franchiseName: "The Godfather Trilogy" } } )
次の例では、c で movieTitle 変数と franchiseName 変数を定義し、その変数を使用して franchiseフィールドを追加します。
db.runCommand( { update: "movies", updates: [ { q: { $expr: { $eq: [ "$title", "$$movieTitle" ] } }, u: [ { $set: { franchise: "$$franchiseName" } } ], c: { movieTitle: "The Godfather", franchiseName: "The Godfather Trilogy" } } ] } )
出力
返されるドキュメントには、次のフィールドのサブセットが含まれます。
update.nupdateコマンドはドキュメントアップデートの配列を受け入れます。その一部はアップサートになる場合があります。アップデートの場合、nはアップデート対象として選択されたドキュメントの数です。アップサートの場合、挿入されたドキュメントのnは1になります。サーバーではすべてのアップデートとアップサートのn値を足し、合計がupdate.nとして返されます。アップデート操作によってドキュメントに変更が生じない場合(例:
$set式は値を現在の値にアップデートし、nはnModifiedより大きくなる可能性があります。
update.nModified更新されたドキュメントの数。 フィールドの値を現在の値に設定するなど、アップデート操作によってドキュメントに変更が生じない場合、
nModifiedはnより小さくなる可能性があります。注意
一致したドキュメントのサブセットが更新された場合、たとえば、更新によって一部のドキュメントがスキーマ検証に失敗する場合、
updateコマンドによって返されるnModifiedの値は正確ではない可能性があります。
update.writeErrors更新操作中に発生したエラーに関する情報を含むドキュメントの配列。
writeErrors配列には、エラーが発生した更新ステートメントごとにエラー ドキュメントが含まれています。各エラー ドキュメントには以下のフィールドが含まれます。
update.writeConcernError書込み保証 (write concern) に関連するエラーを説明するドキュメント。
バージョン での変更7.0.6 :( および でも利用可能6.0.145.0.30 ):が で実行される場合、1 つ以上の書込みエラーが発生しても、書込み保証 (write
updatemongosconcern)エラーが常に報告されます。以前のリリースでは、書込みエラーが発生すると、 は書込み保証 (writeupdateconcern)エラーを報告しないことがありました。writeConcernErrorドキュメントには次のフィールドが含まれています。update.writeConcernError.errInfo.writeConcern対応する操作に使用される書込み保証 (write concern) オブジェクトです。書込み保証 (write concern) オブジェクト フィールドの詳細については、「書込み保証 (write concern) の仕様」を参照してください。
書込み保証 (write concern) オブジェクトには、書込み保証 (write concern) のソースを示す以下のフィールドも含むことができます。
update.writeConcernError.errInfo.writeConcern.provenance書込み保証 (write concern) が発生した場所を示す文字列値です(書込み保証 (write concern)
provenanceと呼ばれます)。次の表は、このフィールドに指定できる値とその意味を示しています。出所説明clientSupplied書き込み保証(write concern)がアプリケーションで指定されました。
customDefault書込み保証 (write concern) は、カスタム定義されたデフォルト値に基づきます。
setDefaultRWConcernを参照してください。getLastErrorDefaults書込み保証 (write concern) は、レプリカセットの
settings.getLastErrorDefaultsのフィールドに基づきます。implicitDefault他の書き込み保証(write concern)が一切指定されていない状態で、サーバーから発生した書き込み保証。
バージョン8.1.2で変更。
update がシャーディングされたクラスター内の mongos で実行されると、他のエラーが 1 つ以上発生した場合でも、レスポンスには常に writeConcernError が報告されます。以前のリリースでは、他のエラーによって update が書込み保証 (write concern)エラーを報告しないことがあります。
例、ドキュメントが検証に失敗して DocumentValidationFailed エラーが発生し、書込み保証 (write concern)エラーも発生した場合、DocumentValidationFailed エラーと writeConcernError の両方が応答の最上位フィールドに返されます。
前述のアップデート固有の戻りフィールドに加えて、 db.runCommand()には追加情報が含まれます。
レプリカ セットの場合、
optime、electionId、$clusterTime、およびoperationTime。シャーディングされたクラスターの場合、
operationTimeおよび$clusterTime。
これらのフィールドの詳細については db.runCommand レスポンスを参照してください。
ソートを伴う更新操作
sample_mflixデータベースの moviesコレクション内のドキュメントには、year、title、num_mflix_comments などのフィールドがあります。
次の例では、1972 からすべての映画を検索し、最もコメントが多い映画を更新します。
db.runCommand( { update: "movies", updates: [ { // Find movies from 1972 q: { year: 1972 }, // Add a classic_status field to the found movie u: { $set: { classic_status: "Most Discussed 1972 Film" } }, // Only update one movie multi: false, // Sort movies by comment count in descending order sort: { num_mflix_comments: -1 } } ] } )
この操作では、最もコメント数が多い 1972 映画のみが更新されます。