定義
collModcollModにより、コレクションにオプションを追加したり、ビュー定義を変更したりできるようになります。Tip
mongoshでは、このコマンドは 、hideIndex()、およびunhideIndex()ヘルパー メソッドを通じて実行することもできます。ヘルパー メソッドは
mongoshユーザーには便利ですが、データベースコマンドと同じレベルの情報は返されない可能性があります。 便宜上必要ない場合、または追加の戻りフィールドが必要な場合は、 データベースコマンドを使用します。注意
collModによって変更されたビューはマテリアライズドビューを参照しません。オンデマンドのマテリアライズドビューについて詳しくは、代わりに$mergeを参照してください。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このコマンドの構文は、次のとおりです。
db.runCommand( { collMod: <collection or view>, <option1>: <value1>, <option2>: <value2>, ... } )
<collection or view> には、現在のデータベース内のコレクションまたはビューの名前を指定します。
オプション
インデックス プロパティを変更する
インデックス オプションを変更するには、変更する既存のインデックス オプションのキー パターンまたは名前のいずれかを指定します。
db.runCommand( { collMod: <collection>, index: { keyPattern: <index_spec> | name: <index_name>, expireAfterSeconds: <number>, // Set the TTL expiration threshold hidden: <boolean>, // Change index visibility in the query planner prepareUnique: <boolean>, // Reject new duplicate index entries unique: <boolean> // Convert an index to a unique index }, dryRun: <boolean> } )
インデックスが存在しない場合は、コマンドはエラーになり、"cannot find index <name|keyPattern> for ns <db.collection>" というメッセージが表示されます。
indexindexオプションは、既存のインデックスの次のプロパティを変更できます。インデックス プロパティ説明expireAfterSecondsTTL コレクションの有効期限しきい値を決定する秒数。
成功した場合、コマンドは次の内容を含むドキュメントを返します。
expireAfterSeconds_new: 次に対する新しい値:expireAfterSecondsexpireAfterSeconds_old: インデックスに以前にexpireAfterSecondsの値があった場合のexpireAfterSecondsの古い値。
インデックス オプション
expireAfterSecondsを変更すると、インデックスの$indexStatsがリセットされます。MongoDB 5.0 より前のバージョンで作成された TTL インデックスを使用する場合、または MongDB 5.0 で作成されたデータを 5.0 より前のインストールと同期する場合は、「NaN を使用して構成されたインデックス」を参照して誤った構成の問題を回避してください。
TTLインデックスの
expireAfterSeconds値は、0から2147483647の範囲内(両端を含む)である必要があります。hiddenインデックスがクエリ プランナーから非表示かどうかを決定するブール値。
hiddenの値が変更された場合、コマンドは変更されたプロパティの古い値と新しい値の両方(hidden_oldとhidden_new)を含むドキュメントを返します。ただし、
hidden値が変更されていない場合(つまり、すでに非表示になっているインデックスを非表示にしたり、すでに非表示になっていないインデックスを表示したりする場合など)は、コマンドは出力からhidden_oldフィールドとhidden_newフィールドを省略します。インデックスを非表示にするには、featureCompatibilityVersion を
4.4以上に設定する必要があります。インデックス オプション
hiddenを変更すると、値が変更された場合にインデックスの$indexStatsがリセットされます。prepareUniqueインデックスが新しい重複エントリを受け入れるかどうかを決定するブール値。
prepareUniqueがtrueの場合、新しい重複エントリは DuplicateKey エラーで失敗します。結果のインデックスはユニークインデックスに変換できます。インデックスを変換するには、uniqueオプションとともにcollModを使用します。既存のインデックスがアップデートされて
prepareUniqueがtrueになった場合、そのインデックスには既存の重複するインデックス エントリがチェックされません。バージョン 6.0 で追加。
uniqueインデックスが一意であるかどうかを決定するブール値。
falseの値はサポートされていません。uniqueがtrueの場合、collModはkeyPatternインデックスをスキャンして重複を検索し、重複するインデックス エントリがない場合にはユニークインデックスに変換します。初期スキャン中に重複が検出された場合、
collModはCannotConvertIndexToUniqueと競合するドキュメントのリストを返します。重複エントリを含むインデックスをユニークインデックスに変換するには、報告された競合を修正し、collModを再実行します。変換を終了するには、
prepareUniqueをfalseに設定します。一意でないインデックスを一意のインデックスに変換する方法の例については、「既存のインデックスを一意のインデックスに変換する 」を参照してください。
バージョン 6.0 で追加。
ドキュメントを検証する
validatorvalidatorにより、ユーザーはコレクションに対して検証ルールまたは式を指定できるようになります。validatorオプションは、検証ルールまたは式を指定するドキュメントを受け取ります。クエリ演算子と同じ演算子を使用して式を指定できます。ただし、$near、$nearSphere、$text、$whereは対象外です。注意
検証はアップデートや挿入中に行われます。既存のドキュメントは、変更されるまで検証チェックを受けません。
admin、local、およびconfigデータベース内のコレクションに対してバリデーターを指定することはできません。system.*コレクションにバリデーターを指定することはできません。
validationLevelvalidationLevelは、アップデート中に MongoDB が既存のドキュメントに検証ルールをどの程度厳密に適用するかを決定します。"off"- 挿入またはアップデートの検証は行われません。
"strict"- デフォルト すべての挿入とすべてのアップデートに検証ルールを適用します。
"moderate"- 既存の有効なドキュメントの挿入とアップデートに検証ルールを適用します。既存の無効なドキュメントのアップデートにはルールは適用しません。
validationLevelを使用する例については、「既存のドキュメントの検証レベルを指定する」を参照してください。
validationActionvalidationActionオプションは、無効なドキュメントに対してerrorを実行するか、違反についてはwarnのみを実行して無効なドキュメントを許可するかを決定します。重要
ドキュメントの検証は、
validationLevelによって決定されたドキュメントにのみ適用されます。validationActionの使用例については、「無効なドキュメントの処理方法を選択する」を参照してください。
ビューを変更する
注意
このコマンドによって変更されたビューは、マテリアライズドビューを参照しません。オンデマンドのマテリアライズドビューについて詳しくは、$merge を参照してください。
viewOn基礎となるソース コレクションまたはビュー。ビュー定義は、指定された
pipelineをこのソースに適用することによって決定されます。アクセス制御を使用して実行されている MongoDB 配置のビューを変更する場合に必要です。
pipeline注意
アクセス制御を使用して実行されている MongoDB 配置のビューを変更する場合に必要です。
ビュー定義はパブリックです。つまり、ビューに対する
db.getCollectionInfos()およびexplain操作には、ビューを定義するパイプラインが含まれます。そのため、ビュー定義で機密性の高いフィールドと値を直接参照することは避けてください。
db.runCommand( { collMod: "myView", viewOn: "activities", pipeline: [ { $match: { status: "Q" } }, { $project: { user: 1, date: 1, description: 1} } ] } )
時系列コレクションを変更する
expireAfterSeconds注意
これは、TTL コレクションの有効期限を変更するために
expireAfterSecondsプロパティでindexオプションを使用することとは異なります。自動ドキュメント削除を有効にするか、時系列コレクションの現在の有効期限間隔を変更するには、
expireAfterSeconds値を変更します。db.runCommand( { collMod: <collection>, expireAfterSeconds: <number> | "off" } ) 自動削除を無効にするには、
expireAfterSecondsを"off"に設定します。または、ドキュメントの有効期限が切れるまでの秒数を指定するには、負ではない 10 進数(>=0)を設定します。
granularity時系列コレクションの粒度を変更するには、
timeseries.granularityを短い時間単位から長い時間単位に増やします。db.runCommand( { collMod: "weather24h", timeseries: { granularity: "seconds" | "minutes" | "hours" } } ) granularityではなく、カスタム バケット パラメーターbucketRoundingSecondsとbucketMaxSpanSecondsをアップデートするには、両方のカスタム パラメーターをcollModコマンドに含めて、同じ値に設定します。db.runCommand( { collMod: "weather24h", timeseries: { bucketRoundingSeconds: 86400, bucketMaxSpanSeconds: 86400 } } ) 粒度間隔またはカスタム バケット値を減らすことはできません。
重要
いずれかの時系列コレクションでカスタム バケット パラメーター
bucketMaxSpanSecondsおよびbucketRoundingSecondsが明示的に指定されている場合は、MongoDB 6.3 より下にダウングレードすることはできません。可能であれば、対応するgranularityに変換します。可能でない場合は、ダウングレードする前にコレクションを削除する必要があります。コレクションをカスタム バケットから
granularity値に変換するには、bucketMaxSpanSecondsとbucketRoundingSecondsの両方がgranularityと同等かそれ以下である必要があります。granularitybucketRoundingSeconds制限(この値を含む)bucketMaxSpanSeconds制限(この値を含む)seconds60
3600
minutes3600
86400
hours86400
2592000
Tip
上限付きコレクションのサイズを変更する
バージョン 6.0 で追加。
MongoDB 6.0 以降では、上限付きコレクションのサイズを変更できるようになりました。上限付きコレクションの最大サイズ(バイト単位)を変更するには、cappedSize オプションを使用します。既存の上限付きコレクション内のドキュメントの最大数を変更するには、cappedMax オプションを使用します。
注意
これらのコマンドを使用して oplog のサイズを変更することはできません。代わりに replSetResizeOplog を使用してください。
たとえば、次のコマンドは、上限付きコレクションの最大サイズを 100000 バイトに設定し、コレクション内のドキュメントの最大数を 500 に設定します。
db.runCommand( { collMod: <collection>, cappedSize: 100000, cappedMax: 500 } )
変更ストリームにおけるドキュメントの変更前と変更後のイメージ
バージョン 6.0 で追加。
MongoDB 6.0 以降では、変更ストリーム イベントを使用して、変更前と変更後のドキュメントのバージョン(変更前とイメージと変更後のイメージ)を出力できます。
変更前のイメージとは、置換、更新、または削除される前のドキュメントです。挿入されたドキュメントには、変更前のイメージはありません。
変更後のイメージとは、挿入、置換、または更新された後のドキュメントです。削除されたドキュメントには、変更後のイメージはありません。
、 、または
changeStreamPreAndPostImagesdb.createCollection()createcollModを使用し、コレクションに対して を有効にします。例、collModコマンドを使用する場合は次のようになります。db.runCommand( { collMod: <collection>, changeStreamPreAndPostImages: { enabled: true } } )
collMod を使用してコレクションの変更ストリームの事前イメージと事後イメージを有効にするには、changeStreamPreAndPostImages フィールドを使用します。
db.runCommand( { collMod: <collection>, changeStreamPreAndPostImages: { enabled: <boolean> } } )
コレクションの変更ストリームの事前イメージと事後イメージを有効にするには、changeStreamPreAndPostImages を true に設定します。例:
db.runCommand( { collMod: "orders", changeStreamPreAndPostImages: { enabled: true } } )
コレクションの変更ストリームの事前イメージと事後イメージを無効にするには、changeStreamPreAndPostImages を false に設定します。例:
db.runCommand( { collMod: "orders", changeStreamPreAndPostImages: { enabled: false } } )
変更ストリーム イベントにおいて、次の条件に当てはまる場合、変更前と変更後のイメージは使用できません。
ドキュメントの更新または削除操作時に、コレクションにおいて有効になっていない場合。
expireAfterSecondsで設定した、変更前と変更後のイメージ保持時間が経過した後に削除された場合。次の例では、クラスター全体で
expireAfterSecondsを100秒に設定します。use admin db.runCommand( { setClusterParameter: { changeStreamOptions: { preAndPostImages: { expireAfterSeconds: 100 } } } } ) 注意
setClusterParameterコマンドはMongoDB Atlasクラスターではサポートされていません。すべてのコマンドに対する Atlas のサポートの詳細については、「 Atlas でサポートされていないコマンド 」を参照してください。次の例では、
expireAfterSecondsを含む現在のchangeStreamOptions設定を返します。db.adminCommand( { getClusterParameter: "changeStreamOptions" } ) expireAfterSecondsをoffに設定すると、デフォルトの保持ポリシーが適用されます。対応する変更ストリーム イベントがoplog から削除されるまで、変更前と変更後のイメージは保持されます。変更ストリーム イベントが oplog から削除されると、
expireAfterSecondsの変更前と変更後のイメージの保持時間にかかわらず、対応する変更前と変更後のイメージも削除されます。
その他の考慮事項
変更前と変更後のイメージを有効にすると、ストレージ容量が消費され、処理時間が増えます。変更前と変更後のイメージは、必要な場合のみ有効にしてください。
変更ストリーム イベントのサイズを 16 メビバイト未満に制限します。イベントのサイズを制限するには、次の方法があります。
ドキュメントのサイズを 8 MB に制限します。
updateDescriptionのような他の変更ストリーム イベントのフィールドがそれほど大きくない場合、変更ストリーム出力で変更前と変更後のイメージを同時にリクエストできます。updateDescriptionのような他の変更ストリーム イベントのフィールドが大きくない場合、最大 16 メビバイトのドキュメントの変更ストリーム出力では、変更後のイメージのみをリクエストします。次の場合、16 メビバイトまでのドキュメントの変更ストリーム出力で、変更前のイメージのみをリクエストします。
ドキュメントのアップデートがドキュメントの構造または内容のごく一部にしか影響しない場合、そして
replace変更イベントが発生しない場合。replaceイベントには、常に変更後のイメージが含まれます。
変更前イメージをリクエストするには、
db.collection.watch()で、fullDocumentBeforeChangeをrequiredまたはwhenAvailableに設定します。変更後イメージをリクエストするには、同じ方法でfullDocumentを設定します。変更前のイメージは
config.system.preimagesコレクションに書き込まれます。config.system.preimagesコレクションが大きくなる場合があります。コレクションのサイズを制限するには、前述のとおり、変更前のイメージにexpireAfterSeconds時間を設定します。変更前のイメージはバックグラウンド プロセスによって非同期で削除されます。
重要
下位互換性のない機能
MongoDB 6.0 以降、変更ストリームにドキュメントの事前イメージと事後イメージを使用している場合は、以前の MongoDB バージョンにダウングレードする前に、collMod コマンドを使用して、各コレクションの changeStreamPreAndPostImages を無効にする必要があります。
Tip
変更ストリーム イベントと出力については、「変更イベント」を参照してください。
コレクションの変更を監視するには、
db.collection.watch()を参照してください。変更ストリーム出力の完全な例については、「Change Streams とドキュメントの変更前イメージおよび変更後イメージ」を参照してください。
コメントを添付する
任意: このコマンドにコメントを添付できます。コメントは最上位フィールドである必要があり、有効な BSON 型 であれば何でもかまいません。指定したコメントは、このコマンドのレコードの横に次の場所に表示されます。
attr.command.cursor.commentフィールド内のmongod ログ メッセージ。command.commentフィールドのデータベースプロファイラー出力。command.commentフィールドのcurrentOp出力。
書込み保証 (write concern)
任意: collMod コマンドの書込みの考慮事項を表すドキュメント。
デフォルトの書込み保証を使用する場合は省略します。
アクセス制御
配置で認証/承認が強制される場合、collMod コマンドを実行するには次の特権が必要です。
タスク | 必要な特権 |
|---|---|
上限付きコレクションを変更する |
|
ビューを変更する |
組み込みロール dbAdmin は必要な特権を提供します。
動作
リソースのロック
collModコマンドは、操作中に指定されたコレクションのコレクション ロックを取得します。
例
インデックスの有効期限値を変更する
次の例では、user_log という名前のコレクションの既存の TTL インデックス { lastAccess: 1 } の expireAfterSeconds プロパティをアップデートします。インデックスの現在の expireAfterSeconds プロパティは 1800 秒(または 30 分)に設定されており、この例では値を 3600 秒(または 60 分)に変更しています。
db.runCommand({ collMod: "user_log", index: { keyPattern: { lastAccess: 1 }, expireAfterSeconds: 3600 } })
成功した場合、操作は変更されたプロパティの古い値と新しい値の両方を含むドキュメントを返します。
{ "expireAfterSeconds_old" : 1800, "expireAfterSeconds_new" : 3600, "ok" : 1 }
クエリ プランナーからインデックスを非表示にする
注意
インデックスを非表示にするには、featureCompatibilityVersion を 5.0 以上に設定する必要があります。
次の例では、orders コレクションの既存のインデックスを非表示にします。具体的には、この操作により、仕様 { shippedDate: 1 } のインデックスがクエリ プランナーから非表示になります。
db.runCommand( { collMod: "orders", index: { keyPattern: { shippedDate: 1 }, hidden: true } } )
成功した場合、操作は変更されたプロパティの古い値と新しい値の両方を含むドキュメントを返します。
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
注意
操作に成功しても、hidden の値が変更されていない場合(具体的には、すでに非表示になっているインデックスを非表示にするか、すでに表示されているインデックスを表示する場合)、コマンドは出力から hidden_old フィールドと hidden_new フィールドを省略します。
テキスト インデックスを非表示にするには、keyPattern ではなく name でインデックスを指定する必要があります。