mongodb - 我应该如何使用 mgo 处理 UUID 字段?
问题描述
我在 MongoDB 中有这个文档:
{
"_id": {
"$oid": "5ad0873b169ade0001345d34"
},
"j": {
"$uuid": "94482b86-1005-e3a0-5235-55fb7c1d648a"
},
"v": "sign",
"d": "a",
"s": "init",
"response": {},
"creation_date": {
"$date": "2018-04-13T10:32:27.140Z"
}
}
我想使用 mgo 在 Golang 中过滤和获取一些文档,这是我的代码:
package main
import (
"fmt"
"log"
"time"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
type JOB struct {
ID bson.ObjectId `bson:"_id,omitempty"`
Key string `bson:"j"`
Svc string `bson:"v"`
DocType string `bson:"d"`
Status string `bson:"s"`
CreationDate time.Time `bson:"creation_date"`
}
func main() {
session, err := mgo.Dial("mongodb://...")
if err != nil {
log.Fatal(err)
}
defer session.Close()
c := session.DB("main").C("job")
var results []JOB
e := c.Find(bson.M{"v": "sign"}).All(&results)
if e != nil {
log.Fatal(e)
}
for _, job := range results[:5] {
fmt.Println(job.ID, job.Key, job.Svc, job.DocType, job.Status, job.CreationDate)
}
}
这是我运行程序时的输出:
ObjectIdHex("5acf91e0269c650001a82683") sign a ok 2018-04-12 19:05:36.294 +0200 CEST
ObjectIdHex("5ad0873b169ade0001345d34") sign a init 2018-04-13 12:32:27.14 +0200 CEST
ObjectIdHex("5ad0873e169ade0001345d36") sign a init 2018-04-13 12:32:30.852 +0200 CEST
ObjectIdHex("5ad08742169ade0001345d38") sign a init 2018-04-13 12:32:34.478 +0200 CEST
ObjectIdHex("5ad087492e083b00013a862a") sign a init 2018-04-13 12:32:41.577 +0200 CEST
问题:
job.Key
(j
MongoDB 文档中的 uuid 字段)保持为空。我也尝试过"github.com/satori/go.uuid"
,但我无法弄清楚。
所以我想知道如何处理那个 uuid 字段,更一般地说如何调试这个问题。完成围棋新手。
例如,在 python 中,我可以获得一个 Document 并使用doc._data
我可以看到该文档的所有字段,在 Go 中是否有等效的方法?
更新
我尝试将 Key 设置为bson.Raw
,我看到一些字节,但无法将它们转换为 uuid:
fmt.Println(job.Key)
u := uuid.FromBytesOrNil(job.Key.Data)
fmt.Println(u)
输出:
{5 [16 0 0 0 3 160 227 5 16 134 43 72 148 138 100 29 124 251 85 53 82]}
00000000-0000-0000-0000-000000000000
解决方案
感谢@Thomas,我发现我正在使用0x05
Kind 获取 bin 数据。
所以我将Job
结构更改为:
Key bson.Binary `bson:"j"`
在进行查询之后,我像这样解组二进制数据:
import "github.com/satori/go.uuid"
var Ids []uuid.UUID
for _, job := range results {
u, err := uuid.FromBytes(job.Key.Data)
if err != nil {
panic(err)
}
Ids = append(Ids, u)
}
所以现在Job.Key.Data
根据这个文档,我有 UUID 的二进制版本。
推荐阅读
- python - 如何重构检查条件的临时变量?
- ms-access - Application.forms.Count 有时不准确
- ios - iOS MMDrawerController Objective-c 登录视图控制器
- r - ggplot2:有没有办法将平均值与箱线图对齐并对齐图例文本?
- typescript - @types/jest index.d.ts 文件返回错误
- javascript - 为什么 React 中总是出现解析错误?
- c# - 如何选择正确的错误消息记录策略
- android - 如何从 MutableLiveData 发出不同的值?
- javascript - 使用 Edge 浏览器时如何在网页中访问 localstorage?
- graphql - Nestjs GraphQL 查询未运行