如何将 Mongo bson 二进制文件转换为 Guid 或 JUUID 之类的东西?

How to convert Mongo bson binary to something like Guid or JUUID?

我正在尝试解码从该查询中检索到的 _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,但当我尝试解码时它会中断。

谢谢。

此致。

如果您正在使用 mongo official go library, change the _id value of type to primitive.ObjectID

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

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

我终于找到了怎么做。

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

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

就是这样,它将 return 给你一个以字节为单位的 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 in this例)

要编码,您可以使用 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)
}

谢谢。