collMod
項目一覧
定義
collMod
collMod
により、コレクションにオプションを追加したり、ビュー定義を変更したりできるようになります。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>"
というメッセージが表示されます。
index
index
オプションは、既存のインデックスの次のプロパティを変更できます。インデックス プロパティ説明expireAfterSeconds
TTL コレクションの有効期限しきい値を決定する秒数。
成功した場合、コマンドは次の内容を含むドキュメントを返します。
expireAfterSeconds_new
: 次に対する新しい値:expireAfterSeconds
expireAfterSeconds_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 で追加。
ドキュメントを検証する
validator
validator
により、ユーザーはコレクションに対して検証ルールまたは式を指定できるようになります。validator
オプションは、検証ルールまたは式を指定するドキュメントを受け取ります。クエリ演算子と同じ演算子を使用して式を指定できます。ただし、$near
、$nearSphere
、$text
、$where
は対象外です。注意
検証はアップデートや挿入中に行われます。既存のドキュメントは、変更されるまで検証チェックを受けません。
admin
、local
、およびconfig
データベース内のコレクションに対してバリデーターを指定することはできません。system.*
コレクションにバリデーターを指定することはできません。
validationLevel
validationLevel
は、アップデート中に MongoDB が既存のドキュメントに検証ルールをどの程度厳密に適用するかを決定します。"off"
- 挿入またはアップデートの検証は行われません。
"strict"
- デフォルト すべての挿入とすべてのアップデートに検証ルールを適用します。
"moderate"
- 既存の有効なドキュメントの挿入とアップデートに検証ルールを適用します。既存の無効なドキュメントのアップデートにはルールは適用しません。
validationLevel
を使用する例については、「既存のドキュメントの検証レベルを指定する」を参照してください。
validationAction
validationAction
オプションは、無効なドキュメントに対して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
と同等かそれ以下である必要があります。granularity
bucketRoundingSeconds
制限(この値を含む)bucketMaxSpanSeconds
制限(この値を含む)seconds
603600minutes
360086400hours
864002592000
上限付きコレクションのサイズを変更する
バージョン 6.0 で追加。
MongoDB 6.0 以降では、上限付きコレクションのサイズを変更できるようになりました。上限付きコレクションの最大サイズ(バイト単位)を変更するには、cappedSize
オプションを使用します。既存の上限付きコレクション内のドキュメントの最大数を変更するには、cappedMax
オプションを使用します。
注意
これらのコマンドを使用して oplog のサイズを変更することはできません。代わりに replSetResizeOplog
を使用してください。
たとえば、次のコマンドは、上限付きコレクションの最大サイズを 100000 バイトに設定し、コレクション内のドキュメントの最大数を 500 に設定します。
db.runCommand( { collMod: <collection>, cappedSize: 100000, cappedMax: 500 } )
変更ストリームにおけるドキュメントの変更前と変更後のイメージ
バージョン 6.0 で追加。
MongoDB 6.0 以降では、変更ストリーム イベントを使用して、変更前と変更後のドキュメントのバージョン(変更前とイメージと変更後のイメージ)を出力できます。
変更前のイメージとは、置換、更新、または削除される前のドキュメントです。挿入されたドキュメントには、変更前のイメージはありません。
変更後のイメージとは、挿入、置換、または更新された後のドキュメントです。削除されたドキュメントには、変更後のイメージはありません。
db.createCollection()
、create
、またはcollMod
を使用し、コレクションに対してchangeStreamPreAndPostImages
を有効にします。
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 } } } } ) 次の例では、
expireAfterSeconds
を含む現在のchangeStreamOptions
設定を返します。db.adminCommand( { getClusterParameter: "changeStreamOptions" } ) expireAfterSeconds
をoff
に設定すると、デフォルトの保持ポリシーが適用されます。対応する変更ストリーム イベントがoplog から削除されるまで、変更前と変更後のイメージは保持されます。変更ストリーム イベントが oplog から削除されると、
expireAfterSeconds
の変更前と変更後のイメージの保持時間にかかわらず、対応する変更前と変更後のイメージも削除されます。
その他の考慮事項
変更前と変更後のイメージを有効にすると、ストレージ容量が消費され、処理時間が増えます。変更前と変更後のイメージは、必要な場合のみ有効にしてください。
変更ストリーム イベントのサイズを 16 メガバイト未満に制限します。イベントのサイズを制限するには、次の方法があります。
ドキュメントのサイズを 8 MB に制限します。
updateDescription
のような他の変更ストリーム イベントのフィールドがそれほど大きくない場合、変更ストリーム出力で変更前と変更後のイメージを同時にリクエストできます。updateDescription
のような他の変更ストリーム イベントのフィールドがそれほど大きくない場合、ドキュメントの変更ストリーム出力では最大 16 MB の変更後のイメージのみをリクエストしてください。次の場合、ドキュメントの変更ストリーム出力では最大 16 MB の変更前のイメージのみをリクエストしてください。
ドキュメントのアップデートがドキュメントの構造または内容のごく一部にしか影響しない場合、そして
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
コマンドを実行するには次の特権が必要です。
タスク | 必要な特権 |
---|---|
上限付きコレクションを変更する | 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
でインデックスを指定する必要があります。