Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

compact

項目一覧

  • 定義
  • 互換性
  • 構文
  • コマンドフィールド
  • compact 必要な特権
  • 動作
compact

コレクション内のすべてのデータとインデックスを書き換えてデフラグします。 WiredTiger データベースでは、このコマンドは不要なディスク領域をオペレーティング システムにリリースします。

このコマンドは、次の環境でホストされている配置で使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

重要

このコマンドは、M 0 、M 2 、M 5クラスターではサポートされていません。 詳細については、「サポートされていないコマンド 」を参照してください。

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

このコマンドの構文は、次のとおりです。

db.runCommand(
{
compact: <collection name>
}
)

このコマンドは、次のフィールドを使用します。

フィールド
タイプ
説明
compact
string
コレクションの名前。
force
flag

任意。指定すると、レプリカセット内のプライマリcompact が強制的に実行されます。compactは、圧縮中のデータベース上のMongoDB CRUD 操作をブロックしません。

comment
any

任意。このコマンドに添付するユーザー指定のコメント。設定すると、このコメントは以下の場所にこのコマンドの記録と合わせて表示されます。

コメントには、有効な BSON 型(string, integer, object, array など)を使用できます。

認証を強制するクラスターの場合、対象のコレクションで compact アクションの特権を持つユーザーとして認証を受ける必要があります。dbAdmin ロールは、システム以外のコレクションに対して compact を実行するために必要な権限を提供します。

システム コレクションの場合は、次の操作を行う必要があります。

  1. システム コレクションでの compact アクションを許可するカスタムロールを作成します。

  2. そのロールを新規または既存のユーザーに付与します。

  3. そのユーザーとして認証を受け、compact コマンドを実行します。

例として、以下の操作では、指定されたデータベースとコレクションに対して compact アクションの権限を付与するカスタムロールが作成されます。

use admin
db.createRole(
{
role: "myCustomCompactRole",
privileges: [
{
resource: { "db" : "<database>" , "collection" : "<collection>" },
actions: [ "compact" ]
}
],
roles: []
}
)

resourceドキュメントの構成の詳細については、 自己管理型配置に関するリソース ドキュメント を参照してください。

既存のユーザーに dbAdmin またはカスタムロールを付与するには、 db.grantRolesToUser() または db.updateUser() を使用します。次の操作では、admin データベース上の myCompactUserにカスタムロール compact が付与されます。

use admin
db.grantRolesToUser("myCompactUser", [ "dbAdmin" | "myCustomCompactRole" ] )

新規ユーザーに dbAdmin またはカスタムロールを付与するには、ユーザーの作成時に db.createUser() メソッドの roles 配列でロールを指定します。

use admin
db.createUser(
{
user: "myCompactUser",
pwd: "myCompactUserPassword",
roles: [
{ role: "dbAdmin", db: "<database>" } | "myCustomCompactRole"
]
}
)

compact 操作の進行状況を確認するには mongod ログファイルを監視するか、別の shell インスタンスから db.currentOp() を実行します。

db.killOp()メソッドを使用してcompactを終了するか、操作が完了する前にサーバーを再起動すると、 compactは終了し、ディスク領域をオペレーティング システムに解放しようとする際に失敗する可能性があります。

コレクションのストレージスペースの変化の推移を確認するには、圧縮の前後に collStats コマンドを実行します。

WiredTigercompact では、コレクション内のデータとインデックスに必要なストレージ領域を削減し、不要なディスク領域をオペレーティング システムに解放しようと試みますこの操作の有効性はワークロードによって異なります。また、ディスク容量が復元されることはありません。このコマンドは、コレクションから大量のデータを削除し、それを置き換える予定がない場合に便利です。

compact WiredTiger データベースで実行するには追加のディスク領域が必要になる場合があります。

レプリカセットに格納されているコレクションとインデックスに対して compact を使用できますが、いくつか重要な考慮事項があります。

  • compact コマンドはプライマリ ノードからセカンダリ ノードに複製されることはありません。

  • 可能な場合は常にセカンダリ ノードで compact を実行する必要があります。セカンダリで compact を実行できない場合は、強制オプションを参照してください。

  • MongoDB 6.1.0 以降(および 6.0.2 と 5.0.12 でも同様)

    • セカンダリ ノードは compact の実行中でも複製できます。

    • 読み取りは許可されています。

クラスター上で compact を実行するには

1

セカンダリノードの一つで compact を実行します。compact が終了したら、残りのセカンダリのそれぞれに対して順に操作を繰り返します。

2

現在のプライマリ ノードを解任して選挙をトリガーするには、 rs.stepDown() メソッドを使用します。特定のセカンダリノードを指名するには、ノードの優先順位を調整します

3

解任後、旧プライマリ ノードはセカンダリ ノードになります。旧プライマリ・ノードで compact を実行します。。

  • セカンダリ ノードは compact の実行中でも複製できます。

  • 読み取りは許可されています。

compactコマンドの実行中、レプリカセットはSECONDARYステータスのままになります。

レプリカセットのノードの状態の詳細については、レプリカセット ノードの状態を参照してください。

レプリカセットのメンテナンスと可用性については、 自己管理型レプリカセット メンバー のメンテナンスの実行 を参照してください。

compact mongod インスタンスにのみ適用されます。シャーディングされた環境では、メンテナンス操作として各シャードで compact を個別に実行します。

mongos インスタンスに対して compact を発行することはできません。

compact 操作の後、mongod ですべてのインデックスが並列に再構築されます。

次の操作では movies コレクションに対して compact コマンドを実行します。

db.runCommand( { compact: "movies" } )

compact を実行すると、次のような出力が返されます。

{ bytesFreed: 27859, ok: 1 }

戻る

collMod