
本文介绍如何通过 mgo 驱动在 go 应用中调用 mongodb 的 `renameCollection` 命令,实现集合重命名,无需手动导出导入数据。
mongodb 本身不提供直接的 ALTER COLLECTION 语法,但支持通过 adminCommand 执行 renameCollection 操作。虽然 mgo(已归档,但仍在广泛使用)未封装该功能为高层方法,但它提供了 session.Run() 接口,允许执行任意数据库命令——这正是重命名集合所需的底层能力。
✅ 正确的命令格式
MongoDB 要求 renameCollection 命令必须以 完整命名空间(Namespace) 形式指定源集合(如 “mydb.users”),目标集合同理,且必须在同一数据库内(跨库重命名在较新版本中已被弃用并默认禁止)。
原始 shell 命令如下:
db.adminCommand({ renameCollection: "mydb.oldcol", to: "mydb.newcol" })
在 Go 中使用 mgo 的等效代码为:
import ( "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" ) // 假设 session 已建立并指向目标数据库 err := session.Run(bson.D{ {"renameCollection", "mydb.oldcol"}, {"to", "mydb.newcol"}, }, nil) if err != nil { log.Fatalf("Failed to rename collection: %v", err) }
⚠️ 注意事项:
- session.Run() 默认在 admin 数据库 上执行命令,因此 renameCollection 字段值必须包含数据库名(如 “mydb.oldcol”),不可省略。
- 目标集合若已存在,默认会报错失败(NamespaceExists)。如需覆盖,可添加 dropTarget: true 选项(仅限 MongoDB
- 操作需具备 renameCollection 权限(通常需 dbAdmin 角色)。
- mgo 已停止维护,建议新项目迁移到官方驱动 mongo-go-driver,其对应方式为调用 database.RunCommand() 并传入 bson.D{{“renameCollection”, …}}。
✅ 完整示例(含错误处理)
func renameCollection(session *mgo.Session, fromNS, toNS string) error { cmd := bson.D{ {"renameCollection", fromNS}, {"to", toNS}, } var result bson.M err := session.Run(cmd, &result) if err != nil { return fmt.Errorf("rename failed: %w, response: %v", err, result) } if ok, _ := result["ok"].(float64); ok != 1 { return fmt.Errorf("command returned non-ok: %v", result) } return nil } // 使用示例 err := renameCollection(session, "mydb.logs_2023", "mydb.logs_archive") if err != nil { log.Fatal(err) }
总结:重命名集合本质是执行 MongoDB 管理命令,mgo 通过 Run() 提供了简洁入口。关键在于严格遵循 namespace 格式、注意权限与兼容性,并在生产环境中充分测试——尤其是目标集合是否存在、副本集状态是否健康(重命名是主节点操作,需确保写入成功同步)。