mongodb - 如何使用 mgo(golang 客户端)查询 mongodb 中的 UUID 字段?

标签 mongodb go uuid mgo

我在查询我的 mongo 集合中提交的 UUID 时遇到问题。 Mongo 文档结构如下:

{
    "_id": {
        "$oid": "5acf7faff5f02b0001e9fda1"
    },
    "j": {
        "$uuid": "d0459793-3ec0-71fd-319e-b959af081db6"
    },
    "s": "ok",
    "creation_date": {
        "$date": "2018-04-12T15:47:59.003Z"
    }
}

我想获取文档,传递 j uuid(不是 ObjectID)。我创建了 mongo 连接,并获取了我的集合,然后尝试执行此查询:

import (    
       mgo "gopkg.in/mgo.v2"
       "gopkg.in/mgo.v2/bson"
)
...
var job *Job
uid, _ := 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。

更新:

当我从 mongo 控制台执行 db.mycol.find() 时,结果是一个文档列表,如:

{ "_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)

它仍然没有返回文档。

最佳答案

MongoDB 文档中的 j 属性属于 BinData 类型 3,因此在将其与字符串匹配时使用过滤器永远不会产生任何结果。

您的第二次尝试是在正确的轨道上。除了您要过滤 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()没有破折号,因此您甚至不需要任何第 3 方库来处理您拥有的 UUID 字符串。

另请注意,gopkg.in/mgo.v2 已不再维护。而是使用社区支持的分支:github.com/globalsign/mgo .

关于mongodb - 如何使用 mgo(golang 客户端)查询 mongodb 中的 UUID 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52187082/

相关文章:

mongodb - 使用凭据连接到 MongoDB - Micronaut

python - Mongoengine查询列表字段包含字符串匹配

go - Go中的 slice 分配是否复制内存

ios - NSUUID 到 NSString

python - 在 django save() 方法中,如果 id 是 UUIDField,您应该如何识别新对象?

node.js - 从环回 mongodb 驱动程序连接时如何增加 Mongolab 的连接超时

javascript - 如何在 MongoDB 中查询引用的对象?

json - 在go中解码json时调整结构

database - 尝试从数据库中选择单行时出现奇怪的错误

node.js - 使用 UUID npm 模块出现奇怪的错误。我究竟做错了什么?