Golang查询MongoDB因类型不匹配导致_id为空、日期解析错误
Go 读取 MongoDB 数据时 _id 为空、时间戳解析异常修复
问题表现
- 读取 JS 脚本预先写入的 MongoDB 数据时,存在两类异常:
_id字段读取结果为空- 日期字段存储为 epoch 时间戳,无法被正确解析为时间类型
相关参考截图
- MongoDB 原始存储数据

- Go 代码中定义的初始结构体模型

- 查询得到的实际返回结果

已尝试的无效操作
- 将 ID 字段类型设置为
uuid.UUID,返回的结构体字段全为零值 - 将 ID 字段类型修改为
string或byte类型,对应字段值仍为空
修复方案
1. 解决 _id 字段为空问题
MongoDB 默认自动生成的 _id 是 ObjectID 类型,并非 UUID 或普通字符串,需要使用官方驱动提供的 primitive 包类型做映射,同时补充正确的 bson 标签:
import "go.mongodb.org/mongo-driver/bson/primitive" type DataModel struct { ID primitive.ObjectID `bson:"_id" json:"id"` // 其余字段按业务定义补充bson标签 }
仅当 JS 写入时手动将
_id赋值为字符串格式 UUID 时,才需要对应使用 UUID 类型映射,未手动指定的默认_id均为 ObjectID,使用上述类型即可正常读取,不会出现空值。
2. 解决 epoch 时间戳解析错误问题
JS 写入时如果直接存入数字类型的 epoch 时间戳(秒/毫秒级),而非 MongoDB 原生 Date 类型,Go 驱动不会自动将其转换为 time.Time,可选择以下任意一种方案处理:
- 临时处理方案:将对应时间字段类型声明为
int64接收原始时间戳,读取完成后自行转换为时间类型type DataModel struct { // ...其余字段 CreateAt int64 `bson:"createAt" json:"createAt"` } // 毫秒级时间戳转换示例 createTime := time.UnixMilli(doc.CreateAt) - 长期优化方案:为结构体实现
bson.Unmarshaler接口,自定义反序列化逻辑,读取时自动将数字时间戳转换为time.Time类型,无需业务代码重复转换。
内容的提问来源于stack exchange,提问作者Lassaad
相关产品推荐
相关产品推荐

