首页 > 解决方案 > 我应该如何使用 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.KeyjMongoDB 文档中的 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

标签: mongodbgouuidmgo

解决方案


感谢@Thomas,我发现我正在使用0x05Kind 获取 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 的二进制版本。


推荐阅读