定義
- compact
- コレクション内のすべてのデータとインデックスを書き換えてデフラグします。 WiredTigerデータベースでは、このコマンドにより不要なディスク領域をオペレーティング システムに解放します。 
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです 
重要
このコマンドは、M0 および Flex クラスターではサポートされていません。詳細については、「 サポートされていないコマンド 」を参照してください。
- MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン 
- MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン 
構文
このコマンドの構文は、次のとおりです。
db.runCommand(    {      compact: <collection name>    } ) 
コマンドフィールド
このコマンドは、次のフィールドを使用します。
注意
MongoDB 4.2 以降
| フィールド | タイプ | 説明 | 
|---|---|---|
| 
 | string | コレクションの名前。 | 
| 
 | flag | 任意。 v4.4 以降では、指定すると、レプリカセット内の v4.4 以降、  | 
| 
 | any | 任意。このコマンドに添付するユーザー指定のコメント。設定すると、このコメントは以下の場所にこのコマンドの記録と合わせて表示されます。 
 コメントには、有効な BSON 型(string, integer, object, array など)を使用できます。 | 
compact 必要な特権
認証を強制するクラスターの場合、対象のコレクションでcompact特権アクションが可能なユーザーとして認証を受ける必要があります。 dbAdminロールは、システム以外のコレクションに対してcompactを実行するために必要な権限を提供します。
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は終了し、ディスク領域をオペレーティング システムに解放しようとする際に失敗する可能性があります。
ディスクスペース
compact コマンドは、不要なブロックをオペレーティング システムに解放して、コレクション内のデータとインデックスで消費されるディスク領域を削減しようとします。 compact の有効性は、解放可能なブロックの数と、ブロックがデータファイル内のどの場所にあるかに相対的です。
コレクションのストレージ容量の変化を確認するには、圧縮の前後でcollStats コマンドを実行します。出力メトリクスcollStats.freeStorageSize を使用して、再利用可能なストレージの量を確認できます。
操作は反復的であり、パスごとにデータファイルのセグメントに対して操作します。 compact が解放するスペースの量の推定値を表示するには、dryRun フラグを使用します。 コレクションで compact を呼び出すと、コレクションとそれに関連するインデックスの両方が圧縮されます。
compact を実行するには追加のディスク領域が必要になる場合があります。
レプリカセット
レプリカセットに格納されているコレクションとインデックスに対して compact を使用できますが、いくつか重要な考慮事項があります。
- compactコマンドはプライマリ ノードからセカンダリ ノードに複製されることはありません。
- 可能な場合は常にセカンダリ ノードで - compactを実行する必要があります。セカンダリで- compactを実行できない場合は、強制オプションを参照してください。
- MongoDB 6.1.0以降 (および6.0.2 ): - セカンダリ ノードは - compactの実行中でも複製できます。
- 読み取りは許可されています。 
 
クラスター上で compact を実行するには
プライマリノードを再度割り当てます。
現在のプライマリ ノードを解任して選挙をトリガーするには、 rs.stepDown() メソッドを使用します。特定のセカンダリノードを指名するには、ノードの優先順位を調整します。
セカンダリノードのバージョン固有の考慮事項
セカンダリ ノードでのブロッキング動作はバージョン固有です。
| バージョン | ブロッキング動作 | 
| 4.4 | 
 | 
| 4.4.17、 5.0.12、および 6.0.2 | 
 | 
compactコマンドの実行中、レプリカセットはSECONDARYステータスのままになります。
レプリカセットのノードの状態の詳細については、レプリカセット ノードの状態を参照してください。
レプリカセットのメンテナンスと可用性については、 自己管理型レプリカセット メンバー のメンテナンスの実行 を参照してください。
シャーディングされたクラスター
compactはmongodインスタンスにのみ適用されます。 シャーディングされた環境では、メンテナンス操作として各シャードでcompactを個別に実行します。