如何将 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)
}
谢谢。
我正在尝试解码从该查询中检索到的 _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)
}
谢谢。