
本文介绍如何通过 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 格式、注意权限与兼容性,并在生产环境中充分测试——尤其是目标集合是否存在、副本集状态是否健康(重命名是主节点操作,需确保写入成功同步)。











