douyun8885 2018-06-16 16:00
浏览 178
已采纳

我应该如何使用mgo处理UUID字段?

I have this Document in 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"
    }
}

I want to filter & fetch some documents in Golang using mgo, and here's my code:

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)

    }

}

Here's the output when I run my program:

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

Problem:

job.Key (j field in MongoDB Document which is a uuid) remains empty. I've tried also "github.com/satori/go.uuid" but I couldn't figure it out.

So I would like to know how to handle that uuid field, and more generally how to debug this problem. Complete newbie in Go.

For example in python I could get a Document and using doc._data I could see all fields of that document, is there a equivalent way of doing this in Go?

UPDATE

I tried to set Key as bson.Raw, I see some bytes, but cannot convert them to uuid:

fmt.Println(job.Key)
u := uuid.FromBytesOrNil(job.Key.Data)
fmt.Println(u)

Output:

{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
  • 写回答

3条回答 默认 最新

  • dsfd3546 2018-06-17 09:42
    关注

    Thanks to @Thomas I've figured out that I'm getting bin data with 0x05 Kind.

    So I changed Job struct to:

    Key             bson.Binary         `bson:"j"`
    

    and after doing query, I unmarshal that binary data like this:

    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)
    }
    

    So now in Job.Key.Data I have binary version of UUID according to this documentation.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?