直接用 renameCollection() 方法即可,但需满足权限、目标不存在、不跨库等条件;跨库重命名须用 db.adminCommand() 并在 admin 库执行;操作会失效游标和变更流,分片集群中加锁影响并发。

直接用 renameCollection() 方法就行,但必须注意权限、目标是否存在、是否跨库这几个硬性条件,否则命令会静默失败或报错。
db.collection.renameCollection() 是最常用的方式
这是 mongosh 里最直观的操作,适用于同数据库内重命名:
- 语法是
db.oldName.renameCollection("newName"),oldName是当前集合名,newName是字符串(必须加引号) - 如果目标名已存在,默认会报错
target namespace exists;加dropTarget: true参数可覆盖:db.oldName.renameCollection("newName", { dropTarget: true }) - 该方法不支持跨数据库操作——比如不能把
test.users直接重命名为prod.users,会提示cannot rename collection across databases - 执行后索引、分片配置、TTL 等元数据全部保留,不需要手动重建
跨数据库重命名必须用 db.adminCommand()
当你要把集合从一个库移到另一个库(比如从 dev.logs 改成 prod.logs),只能走底层命令:
- 命令格式:
db.adminCommand({ renameCollection: "dev.logs", to: "prod.logs", dropTarget: true }) -
renameCollection和to的值都必须是完整命名空间(db.collection形式),不能只写集合名 - 这个命令必须在
admin数据库上下文中运行,或者用有dbAdminAnyDatabase角色的用户连接 - 跨库操作本质是数据迁移,不是元数据更新,耗时取决于集合大小;期间源库和目标库都会被加写锁
常见错误和对应解法
这些错误出现频率高,但原因和修复路径很明确:
-
not authorized on admin to execute command renameCollection:说明当前用户没权限。解决方式是切换到admin库并用root或dbAdminAnyDatabase用户执行,而不是在业务库下直接调用adminCommand -
collection not found:先确认当前数据库是否正确,再运行show collections;注意db.collection.renameCollection()中的collection是当前库下的集合名,不带库前缀 -
target namespace exists:目标名已被占用。要么加{ dropTarget: true },要么先手动db.targetCollection.drop() - 命令执行后应用查不到数据:检查应用代码里是否还硬编码了旧集合名,重命名不会自动更新客户端逻辑
重命名会中断正在运行的查询和变更流
这是容易被忽略的副作用:
-
renameCollection会令所有打开的游标失效,正在执行的find()、聚合管道可能直接返回错误或空结果 - 如果用了变更流(change stream),源集合和目标集合上已开启的流都会收到
invalidate事件,需要客户端做重连处理 - 在分片集群中,该操作会对涉及的每个分片加独占锁,影响并发写入;大集合建议在低峰期操作
- mongodump 带
--oplog时,若 dump 过程中触发 rename,dump 会失败——备份和重命名不要同时跑

















