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

GoCDK Docstore:使用UUID作为主键时如何正确检索文档

解决GoCDK中MongoDB使用UUID作为主键的检索问题

问题根源

  1. collection.Get panic:GoCDK的MongoDB数据存储实现中,uuid.UUID本质是[16]byte数组,作为主键时,内部哈希处理逻辑触发异常。
  2. 查询无结果: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:46:34