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

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の新機能。

dryRun

デフォルト値: false

index.uniqueがtrueの場合にのみ使用されます。

一意でないインデックスを一意のインデックスに変換する前に、 dryRun: trueとともにcollModコマンドを実行できます。 そうすると、MongoDB はコレクション内で重複キーをチェックし、違反を返します。

dryRun: trueを使用して、エラーなくインデックスを一意に変換できることを確認します。

注意

競合するすべてのドキュメント_id 値を含む応答が 8 MB を超える場合、特定の違反をリストする代わりに、 MongoDB は次のエラーメッセージを返します。

Cannot convert the index to unique. Too many conflicting documents
were detected. Please resolve them and rerun collMod.

この場合は、レスポンスが 8MB 未満になるまで重複エントリを解決し、collMod を再度実行して残りの違反を確認します。

validator

validator により、ユーザーはコレクションに対して検証ルールまたは式を指定できるようになります。

validator オプションは、検証ルールまたは式を指定するドキュメントを受け取ります。クエリ演算子と同じ演算子を使用して式を指定できます。ただし、$near、$nearSphere、$text、$where は対象外です。

注意

  • 検証はアップデートや挿入中に行われます。既存のドキュメントは、変更されるまで検証チェックを受けません。

  • admin、local、および config データベース内のコレクションに対してバリデーターを指定することはできません。

  • system.* コレクションにバリデーターを指定することはできません。

validationLevel

validationLevel は、アップデート中に MongoDB が既存のドキュメントに検証ルールをどの程度厳密に適用するかを決定します。

"off"

挿入またはアップデートの検証は行われません。

"strict"

デフォルト すべての挿入とすべてのアップデートに検証ルールを適用します。

"moderate"

既存の有効なドキュメントの挿入とアップデートに検証ルールを適用します。既存の無効なドキュメントのアップデートにはルールは適用しません。

"constraint"

すべての挿入とすべてのアップデートに検証ルールを適用し、コレクション内のすべてのドキュメントがルールを満たすことを保証します。

バージョン9.0の新機能。

validationLevel を使用する例については、「既存のドキュメントの検証レベルを指定する」を参照してください。

prepareConstraintValidationLevel

バージョン9.0の新機能。

既存のコレクションをconstraintvalidationLevel へのアップグレードで準備するブール値。デフォルトはfalse です。

既存のコレクションをconstraint 検証レベルにアップグレードするには、まずcollMod prepareConstraintValidationLevelを に設定してtrue を実行します。true の場合、 MongoDB はbypassDocumentValidation をブロックし、 への変更を防ぎます。validator

prepareConstraintValidationLevelを使用する例については、「 制約検証の指定 」を参照してください。

validationAction

validationAction オプションは、無効なドキュメントに対して error を実行するか、違反については warn のみを実行して無効なドキュメントを許可するかを決定します。

重要

ドキュメントの検証は、validationLevel によって決定されたドキュメントにのみ適用されます。

validationAction の使用例については、「無効なドキュメントの処理方法を選択する」を参照してください。

注意

このコマンドによって変更されたビューは、マテリアライズドビューを参照しません。オンデマンドのマテリアライズドビューについて詳しくは、$merge を参照してください。

viewOn

基礎となるソース コレクションまたはビュー。ビュー定義は、指定された pipeline をこのソースに適用することによって決定されます。

アクセス制御を使用して実行されている MongoDB 配置のビューを変更する場合に必要です。

pipeline

ビューを定義する集計パイプライン。

注意

ビュー定義pipelineには、$outまたは$mergeステージを含めることはできません。この制限は、$lookupステージまたは$facetステージで使用されるパイプラインなどの埋め込みパイプラインにも適用されます。

アクセス制御を使用して実行されている MongoDB 配置のビューを変更する場合に必要です。

ビュー定義はパブリックです。つまり、ビューに対する db.getCollectionInfos() および explain操作には、ビューを定義するパイプラインが含まれます。そのため、ビュー定義で機密性の高いフィールドと値を直接参照することは避けてください。

db.runCommand( {
collMod: "myView",
viewOn: "activities",
pipeline: [
{ $match: { status: "Q" } },
{ $project: { user: 1, date: 1, description: 1} } ]
} )

注意

collMod操作の timeseries パラメータで変更を指定した場合、同じコマンドで他の変更オプションを使用することはできません。時系列変更は、他のコレクション変更とは別の専用コマンドで実行する必要があります。

expireAfterSeconds

注意

これは、TTL コレクションindex の有効期限を変更するためにexpireAfterSeconds プロパティで オプションを使用することとは異なります。

自動ドキュメント削除を有効にするか、時系列コレクションの現在の有効期限間隔を変更するには、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

60

3600

minutes

3600

86400

hours

86400

2592000

バージョン6.0の新機能。

MongoDB 6.0 以降では、上限付きコレクションのサイズを変更できるようになりました。上限付きコレクションの最大サイズ(バイト単位)を変更するには、cappedSize オプションを使用します。既存の上限付きコレクション内のドキュメントの最大数を変更するには、cappedMax オプションを使用します。

注意

これらのコマンドを使用して oplog のサイズを変更することはできません。代わりに replSetResizeOplog を使用してください。

cappedSize

上限コレクションの新しい最大サイズ(単位: バイト)を指定します。cappedSize は 0 より大きく、1e+15(1 PB)より小さくなければなりません。

cappedMax

上限付きコレクション内のドキュメントの新しい最大数を指定します。cappedMax を 0 以下に設定すると、制限がなくなります。

たとえば、次のコマンドは、上限付きコレクションの最大サイズを 100000 バイトに設定し、コレクション内のドキュメントの最大数を 500 に設定します。

db.runCommand( {
collMod: <collection>,
cappedSize: 100000,
cappedMax: 500
} )

バージョン6.0の新機能。

changeStreamPreAndPostImages

MongoDB 6.0 以降では、変更ストリーム イベントを使用して、変更前と変更後のドキュメントのバージョン(変更前とイメージと変更後のイメージ)を出力できます。

  • 変更前のイメージとは、置換、更新、または削除される前のドキュメントです。挿入されたドキュメントには、変更前のイメージはありません。

  • 変更後のイメージとは、挿入、置換、または更新された後のドキュメントです。削除されたドキュメントには、変更後のイメージはありません。

  • 、 、またはchangeStreamPreAndPostImagesdb.createCollection() createcollModを使用し、コレクションに対して を有効にします。例、collMod コマンドを使用する場合は次のようになります。

    db.runCommand( {
    collMod: <collection>,
    changeStreamPreAndPostImages: { enabled: true }
    } )

コレクションの現在のchangeStreamPreAndPostImages 設定を確認するには、db.getCollectionInfos() を実行します。

db.getCollectionInfos( {
name: "<collection>"
} )[0].options.changeStreamPreAndPostImages
{ 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 時間を設定します。

    • config.system.preimages のサイズを監視するには、シャーディングされたクラスターか、レプリカセットの mongod ノードに接続します。次に、以下のコマンドを実行します。

      use config
      db.system.preimages.totalSize()
      db.system.preimages.stats()

      注意

      これらのコマンドを実行するには、config.system.preimages コレクションに対する collStats 権限アクションが必要です。

      MongoDB Atlas 配置でこれらのコマンドを実行するには、atlasAdmin ロールが必要です。

    • 変更前のイメージはバックグラウンド プロセスによって非同期で削除されます。

重要

下位互換性のない機能

MongoDB6.0 以降、変更ストリームにドキュメントの変更前のイメージと変更後のイメージを使用している場合は、以前のMongoDBバージョンにダウングレードする前に、 collModコマンドを使用して各コレクションの changeStreamPreAndPostImages を無効にする必要があります。

Tip

comment

任意: このコマンドにコメントを添付できます。コメントは最上位フィールドである必要があり、有効な BSON 型 であれば何でもかまいません。指定したコメントは、このコマンドのレコードの横に次の場所に表示されます。

w

任意: collMod コマンドの書込みの考慮事項を表すドキュメント。

デフォルトの書込み保証を使用する場合は省略します。

配置で認証/承認が強制される場合、collMod コマンドを実行するには次の特権が必要です。

タスク
必要な特権

上限付きコレクションを変更する

collMod データベース内

ビューを変更する

collMod データベース内、および次のいずれか:

  • 変更するビューにfindがないまたは

  • 変更するビューの find と、ソース コレクションまたはビューの find の両方。

組み込みロール 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 を 7.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 でインデックスを指定する必要があります。