亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 mgo(golang 客戶端)查詢 mongodb 中的 UUID 字段?

如何使用 mgo(golang 客戶端)查詢 mongodb 中的 UUID 字段?

Go
倚天杖 2023-03-29 17:05:20
我在查詢我的 mongo 集合中提交的 UUID 時遇到問題。Mongo文檔結構如下:{    "_id": {        "$oid": "5acf7faff5f02b0001e9fda1"    },    "j": {        "$uuid": "d0459793-3ec0-71fd-319e-b959af081db6"    },    "s": "ok",    "creation_date": {        "$date": "2018-04-12T15:47:59.003Z"    }}我想獲取文檔,傳遞juuid(不是 ObjectID)。我創建了 mongo 連接,并獲取了我的集合,然后我嘗試執行此查詢:import (           mgo "gopkg.in/mgo.v2"       "gopkg.in/mgo.v2/bson")...var job *Jobuid, _ := uuid.FromString(m.ID)e := c.Find(bson.M{"j": uid.String()}).One(&job)但e始終等于“未找到”。m.ID是沒有破折號的 uuid 字符串-,所以我將它轉換為uuid.UUID.其他查詢c.Find(bson.M{"s": "ok"}).All(&jobs)工作正常,所以我確定連接和收集。使用 golang 1.11 和 mongodb 3.6。更新:當我db.mycol.find()從 mongo 控制臺執行時,結果是一個文檔列表,例如:{ "_id" : ObjectId("5acf5b0ac7fb0700010040ac"), "j" : BinData(3,"amOjUW1oQQ6dNsvLrQuDhg=="), "s" : "ok", "creation_date" : ISODate("2018-04-12T13:11:38.365Z") }所以我試著像這樣修改我的查詢:e := c.Find(bson.M{"j": bson.Binary{0x03, []byte(m.ID)}}).One(&job)而且它仍然不返回文件。
查看完整描述

3 回答

?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

MongoDB 文檔中的屬性j是類型BinData3,因此在將它與字符串匹配時使用過濾器永遠不會產生任何結果。


你的第二次嘗試是在正確的軌道上。除了您要過濾 UUID 字符串的十六進制表示的 UTF-8 字節序列(這是 Go 在內存中存儲字符串的方式,這是 -> 轉換產生的結果string)[]byte。這將永遠不會產生任何結果。


原因是您必須提供的二進制數據bson.Binary不是上述值,而是 UUID 的原始字節。


因此,您要做的是對 UUID(以十六進制表示形式提供給您)進行十六進制解碼,并使用此二進制數據。


data, err := hex.DecodeString(m.ID)

if err != nil {

? ? panic(err)

}


e := c.Find(bson.M{"j": bson.Binary{

? ? Kind: bson.BinaryUUIDOld,

? ? Data: data,

}}).One(&job)

請注意,您必須將 UUID 傳遞給hex.DecodeString()不帶破折號的,因此您甚至不需要任何第三方庫來處理您擁有的 UUID 字符串。

另請注意,gopkg.in/mgo.v2不再維護。而是使用社區支持的 fork:?github.com/globalsign/mgo。


查看完整回答
反對 回復 2023-03-29
?
達令說

TA貢獻1821條經驗 獲得超6個贊

如果您有要查詢的 GUID,則轉換對我有用(重新排序密鑰字節,然后轉換為十六進制解碼):


func CsuuidToBinary(key string) []byte {

    hexStr := strings.Replace(key, "-", "", -1)

    first := hexStr[6:8] + hexStr[4:6] + hexStr[2:4] + hexStr[0:2]

    second := hexStr[10:12] + hexStr[8:10]

    third := hexStr[14:16] + hexStr[12:14]

    fourth := hexStr[16:len(hexStr)]

    hexStr = first + second + third + fourth


    data, _ := hex.DecodeString(hexStr)

    return data

}

進而:


    data := CsuuidToBinary(guidKey)


    var a A

    err := collection.Find(bson.M{"SomeKey": bson.Binary{Kind: 0x03, Data: data,}}).One(&a)



查看完整回答
反對 回復 2023-03-29
?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

這是因為 UUID 存儲為二進制數據,您需要將其轉換為字符串才能查詢它


查看完整回答
反對 回復 2023-03-29
  • 3 回答
  • 0 關注
  • 181 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號