You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:37:38