【问题标题】:How to convert Mongo bson binary to something like Guid or JUUID?如何将 Mongodb bson 二进制文件转换为 Guid 或 UUID 之类的东西?
【发布时间】:2021-04-05 15:46:09
【问题描述】:

我正在尝试解码从该查询中检索到的 _id。

type fcc struct {
   ID  bson.RawValue   `bson:"_id"`
}

func GetFromfccId(fccId string) {

result := fcc{}
conn := auth.Authenticate()
collection := conn.Database("something").Collection("else")

err := collection.FindOne(context.TODO(), bson.M{"fccId":fccId}).Decode(&result)
if err != nil {
    log.Fatal(err)
}

  fmt.Println(result.ID)
}

这就是我从 mongo 驱动程序中得到的东西

{"$binary":{"base64":"wk8bWKTMKUMWhSuvVLdahQ==","subType":"03"}}

如何将其转换为 JUUID 或 Guid 之类的内容?

我不能用这种二进制格式做任何事情。

我曾尝试在结构中使用 uuid.UUID,但当我尝试解码时它会中断。

谢谢。

问候。

【问题讨论】:

    标签: mongodb go bson


    【解决方案1】:

    如果您使用mongo official go library,请将type的_id值更改为primitive.ObjectID

    如果您想要此 ObjectId 的字符串表示,您可以使用其ObjectID.Hex() 方法来获取 ObjectId 字节的十六进制表示。 类似的,

    objectID := mongoId.(primitive.ObjectID).Hex()
    

    【讨论】:

    • 如果我保留为 bson 并更改为 primite.ObjectID ID primitive.ObjectID bson:"_id" 并且它返回 错误解码密钥 _id: cannot decode binary into an ObjectID if I change to json I can应用您的逻辑,但它返回 000000000000000000000000
    【解决方案2】:

    我终于找到了方法。

    如果数据在 mongo 中保存为二进制(类型 3),您可以将此数据检索为 LUUID,将类型更改为primitive.Binary。

    type fcc struct {
        ID  primitive.Binary   `bson:"_id"`
    }
    

    就是这样,它会以字节为单位返回一个 LUUID,类似于这样。

    {3 [75 77 158 195 190 205 183 38 234 126 239 224 5 182 53 133]}
    

    第一个字节表示类型,本例中的 3 是二进制,其余的是您的数据。

    但如果在这种情况下您收到一个 JUUID(我的情况),您需要将此 JUUID 转换为 LUUID 才能在 mongo 中查询此数据。

    在 go 中没有构建函数或库来执行此操作(至少我找不到它)。 您只需像这样更改字节的顺序即可完成此操作。

    func JuuidToUuid(juuid string) []byte{
    
        var byteShift []byte
    
        u, err := uuid.FromString(juuid)
        if err != nil {
           log.Fatal(err)
        }
    
        for x := 7; x > -1; x-- {
           byteShift = append(byteShift, u[x])
        }
        for x := 15; x > 7; x-- {
          byteShift = append(byteShift, u[x])
       }
    
       return byteShift
    }
    

    但这仍然不足以让 mongo 理解,因为这不是一个有效的二进制文件,您仍然需要将其编码为二进制文件才能添加具有类型的第一个字节(在本例中为 3)

    要编码,您可以使用 bson 库。

    id := converter.JuuidToUuid(businessPremisesId)
    binaryId := primitive.Binary{
        Subtype: 3,
        Data:    id,
    }
    

    就是这样,现在您可以查询一个有效的二进制类型了。

    err := collection.FindOne(context.TODO(), bson.M{"_id":binaryId}).Decode(&bpData)
    if err != nil {
        log.Fatal(err)
    }
    

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多