GoCDK Docstore:使用UUID作为主键时如何正确检索文档
解决GoCDK中MongoDB使用UUID作为主键的检索问题
问题根源
collection.Getpanic:GoCDK的MongoDB数据存储实现中,uuid.UUID本质是[16]byte数组,作为主键时,内部哈希处理逻辑触发异常。- 查询无结果:MongoDB存储UUID时默认以**二进制BSON类型(UUID subtype 0x04)**保存,用
id.String()字符串匹配无法命中二进制数据。
方案1:使用BSON二进制类型匹配UUID查询
直接将uuid.UUID转换为MongoDB兼容的二进制类型进行查询,适配存储的原始数据格式:
import ( "io" "fmt" "github.com/google/uuid" "go.mongodb.org/mongo-driver/bson" // 引入你的lib包和GoCDK相关包 ) func Load(id uuid.UUID) (*lib.PayloadItem, error) { var payload lib.PayloadItem // 将UUID转为MongoDB标准的二进制UUID格式 uuidBSON := bson.Binary{ Subtype: bson.SubtypeUUID, Data: id[:], } iter := collection.Query().Where("id", "=", uuidBSON).Limit(1).Get(ctx) defer iter.Stop() if err := iter.Next(ctx, &payload); err != nil { if err == io.EOF { return nil, fmt.Errorf("payload with id %s not found", id.String()) } return nil, err } return &payload, nil }
方案2:改用字符串类型存储UUID(兼容collection.Get)
如果希望正常使用collection.Get方法,可将结构体的UUID字段改为字符串类型,避免数组类型带来的哈希问题:
// 修改结构体定义 type PayloadItem struct { ID string `json:"id" bson:"_id"` // 用字符串存储UUID Time time.Time `json:"time" bson:"time"` Message *string `json:"message,omitempty" bson:"message,omitempty"` State PayloadState `json:"state" bson:"state"` } // 存储时生成字符串UUID func Save(payload *lib.PayloadItem) error { payload.ID = uuid.New().String() return collection.Create(ctx, payload) } // 检索时直接用字符串ID调用Get func Load(id string) (*lib.PayloadItem, error) { payload := lib.PayloadItem{ID: id} if err := collection.Get(ctx, &payload); err != nil { return nil, err } return &payload, nil }
额外注意
若坚持使用uuid.UUID类型作为主键,需确保GoCDK的MongoDB驱动版本已修复数组类型主键的哈希问题,同时结构体需添加正确的bson标签(如bson:"_id"指定MongoDB主键字段)。
内容的提问来源于stack exchange,提问作者Nikole
相关产品推荐
相关产品推荐

