如何在Go语言的MGO MongoDB驱动中获取文档的ObjectId(_id)
解决mgo驱动获取Mongo ObjectId(_id)的问题
嘿,我之前用mgo的时候也踩过这个坑,刚好能帮到你!你现在的问题出在结构体里_id的类型定义上,Mongo的ObjectId是12字节的二进制类型,不是普通字符串,直接用string类型的话mgo没法正确反序列化它,得用mgo专门提供的bson.ObjectId类型来对应。
第一步:修正结构体定义
首先要导入gopkg.in/mgo.v2/bson包,然后把结构体里的_id字段改成bson.ObjectId类型,同时通过bson标签绑定Mongo里的_id字段:
import "gopkg.in/mgo.v2/bson" type FunnyNumber struct { Value int ID bson.ObjectId `bson:"_id"` // 首字母大写保证外部包可访问,标签指定对应Mongo的_id }
如果你坚持想用小写的_id字段名,也可以这么写,但注意小写字段在Go里是包私有,后续如果要在其他包操作可能会有问题:
type FunnyNumber struct { Value int _id bson.ObjectId `bson:"_id"` }
第二步:查询后获取ObjectId
当你执行查询操作后,结构体里的ID字段就会被自动赋值为对应的Mongo ObjectId,如果你需要把它转成字符串格式(比如前端展示),可以用Hex()方法:
session, err := mgo.Dial("127.0.0.1:27017") if err != nil { panic(err) } defer session.Close() session.SetMode(mgo.Monotonic, true) c := session.DB("m101").C("funnynumbers") var fn FunnyNumber // 假设根据value查询文档 err = c.Find(bson.M{"value": 666}).One(&fn) if err != nil { panic(err) } // 获取原始ObjectId fmt.Println("原始ObjectId:", fn.ID) // 获取字符串格式的ObjectId fmt.Println("字符串格式ObjectId:", fn.ID.Hex())
额外:插入文档后获取自动生成的ObjectId
如果插入文档时你没有手动指定_id,Mongo会自动生成一个ObjectId,插入操作完成后,结构体里的ID字段会被自动填充这个生成的值:
fn := FunnyNumber{Value: 888} err := c.Insert(&fn) if err != nil { panic(err) } // 插入后直接获取自动生成的ObjectId fmt.Println("新文档的ObjectId:", fn.ID.Hex())
这样处理后,你就能正确获取到Mongo文档内部的_id啦!
内容的提问来源于stack exchange,提问作者Velidan
相关产品推荐
相关产品推荐

