定義
renameCollection既存のコレクションの名前を変更します。コレクション名を完全な名前空間(
<database>.<collection>)の形式でrenameCollectionに指定します。Tip
mongoshでは、このコマンドはrenameCollection()ヘルパーメソッドを通じて実行することもできます。ヘルパー メソッドは
mongoshユーザーには便利ですが、データベースコマンドと同じレベルの情報は返されない可能性があります。便宜上必要ない場合、または追加の戻りフィールドが必要な場合は、データベースコマンドを使用します。管理データベースに対して
renameCollectionコマンドを発行します。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas はクラウドでの MongoDB 配置のための完全管理サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
Stable API でのサポート
MongoDB 8.1 以降、Stable API V1 に renameCollection が含まれています。Stable APIで renameCollection を使用するには、 MongoDB 8.1 以降を実行中配置にドライバーを接続する必要があります。
構文
このコマンドの構文は、次のとおりです。
db.runCommand( { renameCollection: "<source_namespace>", to: "<target_namespace>", dropTarget: <true|false>, writeConcern: <document>, comment: <any> } )
コマンドフィールド
このコマンドには次のフィールドが含まれています。
フィールド | タイプ | 説明 |
|---|---|---|
| string | 名前を変更するコレクションの名前空間。名前空間は、データベース名とコレクションの名前の組み合わせです。 |
| string | コレクションの新しい名前空間。新しい名前空間で別のデータベースが指定されている場合、 MongoDB Atlas配置では、 |
| ブール値 | オプション。 |
| ドキュメント | 任意。操作の書込み保証(write concern)を表現するドキュメント。デフォルトの書込み保証を使用する場合は省略します。 シャードされたクラスターで発行されると、 は、 |
| any | 任意。このコマンドに添付するユーザー指定のコメント。設定すると、このコメントは以下の場所にこのコマンドの記録と合わせて表示されます。
コメントには、有効な BSON 型(string, integer, object, array など)を使用できます。 |
動作
シャーディングされたコレクション
シャーディングされたコレクションの名前を変更するには、renameCollection コマンドを使用します。ターゲットデータベースはソースデータベースと同じである必要があります。この操作、すべてのインデックスが保持されます。
シャーディングされていないコレクション
ソース データベースとターゲット データベースが同じプライマリシャード を持っている場合は、renameCollection を使用してシャーディングされたクラスター内のシャーディングされていないコレクションの名前を変更できます。renameCollection を実行して同じデータベース内のコレクションの名前を変更すると、操作コレクションデータとインデックスが保持されます。別のデータベースに対して renameCollection を実行すると、この操作コレクションデータとインデックスが新しいファイルに書き換えられます。
時系列コレクション
renameCollection を使って時系列コレクションの名前を変更することはできません。詳細については「時系列コレクションの制限」を参照してください。
既存のターゲット コレクション
renameCollection は、target が既存のコレクションの名前で、かつ dropTarget: true を指定しない場合失敗します。
進行中のインデックスビルド
ソースコレクションでインデックス構築が進行中の場合、名前変更操作は失敗し、BackgroundOperationInProgressForNamespace エラーが発生します。ターゲットコレクションでインデックス構築が進行中で、dropTarget: true を指定した場合、操作も失敗します。
コレクション の名前を変更するには、インデックス構築が完了するまで待ってから、操作を再試行します 。進行中のインデックスビルドを確認するには、db.currentOp() メソッドを使用します。
パフォーマンス
renameCollection は、ターゲットの名前空間に応じて、異なるパフォーマンスへの影響があります。
ターゲットデータベースがソースデータベースと同じである場合、renameCollection は名前空間を変更します。この操作はすぐに実行されます。
ターゲットデータベースがソースデータベースと異なる場合、renameCollection はソースコレクションからターゲットコレクションにすべてのドキュメントをコピーします。コレクションのサイズによっては、完了まで時間がかかる場合があります。
シャーディングされたクラスターでのリソース ロック
バージョン5.0で変更。
シャーディングされたクラスター内のシャーディングされたコレクションまたはシャーディングされていないコレクションの名前を変更すると、ソース コレクションとターゲット コレクションだけがすべてのシャードでロックされます。ソース コレクションとターゲット コレクションでのその後の操作は、名前変更操作が完了するまで待つ必要があります。
MongoDB でのロックの詳細については、「FAQ: 同時実行性」を参照してください。
レプリカセットでのリソース ロック
同じデータベース内のコレクションの名前を変更すると、renameCollection は操作中にソース コレクションとターゲット コレクションに対して排他ロックを取得します。コレクションに対する後続のすべての操作は、renameCollection が完了するまで待機する必要があります。
MongoDB8.3.12 以降では、異なるデータベース間でコレクションの名前を変更すると、renameCollection は操作中にソース コレクションとターゲット コレクションに対して排他ロックを取得します。ソース コレクションとターゲット コレクションの DDL 操作と書込みrenameCollection (write) は、 が完了するまで待機する必要があります。ほとんどの読み取り操作はロックフリーの読み取りを使用するため、ブロックされません。
8.3.12 より前のバージョンでは、クロスデータベースの名前変更中に、renameCollection はコピー フェーズ中にソースコレクションの共有ロック(S)のみを保持し、名前変更が完了する前にロックを解放しました。
ロックの変更はレプリカセットにのみ影響します。このページで以前に説明したように、シャーディングされたクラスターは、名前変更中に両方のコレクションをすでにロック。
MongoDB でのロックの詳細については、「FAQ: 同時実行性」を参照してください。
local Database
コレクションの名前を、複製されたデータベースから、複製されていない
localデータベースに変更することはできません。コレクションの名前を、複製されていない
localデータベースから複製されたデータベースに変更することはできません。
オープンカーソルと変更ストリーム
警告
db.collection.renameCollection()メソッドとrenameCollection コマンドは、オープン カーソルを無効にします。これにより、 ソース コレクション または ターゲットコレクションで開かれている既存の変更ストリームの 無効化イベントが作成され、名前が変更されたコレクションから現在データを返しているクエリも中断されます。
相互作用: mongodump
mongodump--oplogrenameCollectionで開始された は、ダンプ プロセス中にクライアントが コマンドを発行すると失敗します。詳しくは、mongodump.--oplog を参照してください。
例
次の例では、test データベース内の orders という名前のコレクションの名前を、test データベース内のコレクションの orders2014 に変更します。
db.adminCommand( { renameCollection: "test.orders", to: "test.orders2014" } )
mongoshdb.collection.renameCollection()は、同じデータベース内のコレクションの名前を変更するための コマンドの ヘルパーを提供します。次の は、前の例と同等です。
use test db.orders.renameCollection( "orders2014" )