登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-06 08:09:34 115浏览 收藏

本篇文章给大家分享《如何将 Mongo bson 二进制文件转换为 Guid 或 JUUID 之类的东西?》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我正在尝试解码从此查询中检索到的 _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 中保存为二进制(类型 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)
}

谢谢。

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

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

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

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何将 Mongo bson 二进制文件转换为 Guid 或 JUUID 之类的东西?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>