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

Golang查询MongoDB因类型不匹配导致_id为空、日期解析错误

Go 读取 MongoDB 数据时 _id 为空、时间戳解析异常修复

问题表现

  • 读取 JS 脚本预先写入的 MongoDB 数据时,存在两类异常:
    • _id 字段读取结果为空
    • 日期字段存储为 epoch 时间戳,无法被正确解析为时间类型

相关参考截图

  • MongoDB 原始存储数据
    MongoDB原始数据
  • Go 代码中定义的初始结构体模型
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:45:37