Golang / mgo:无法从MongoDB文档中检索int字段的值

时间:2012-08-18 00:01:12

标签: mongodb go mgo

我正在查询一个包含其值中的整数值的集合,并将结果文档加载到此结构中:

type Subscription struct {
    Id bson.ObjectId "_id,omitempty"
    Listen string
    Job string
    TimeoutSeconds int
    Data string
}


var subscription Subscription

subscriptions := subscriptionsCol.Find(bson.M{"listen": "example_channel"}).Iter()
for subscriptions.Next(&subscription) {
    log("Pending job: %s?%s (timeout: %d)\n",
            subscription.Job, 
            subscription.Data, 
            subscription.TimeoutSeconds)
}

这是phpMoAdmin向我展示的内容:

[_id] => MongoId Object (
    [$id] => 502ed8d84eaead30a1351ea7
)
[job] => partus_test_job_a
[TimeoutSeconds] => 30
[listen] => partus.test
[data] => a=1&b=9

令我感到困惑的是,subscription.TimeoutSeconds总是包含0,当我肯定时,我在集合中插入的文档中有30

检索所有其他值。

int类型有什么问题?

2 个答案:

答案 0 :(得分:4)

您是否尝试过设置该字段的“密钥”值?

Unmarshal

  

小写字段名称用作每个导出字段的键,   但是可以使用相应的字段标记更改此行为。

type Subscription struct {
    Id              bson.ObjectId    "_id,omitempty"
    Listen          string
    Job             string
    TimeoutSeconds  int     "TimeoutSeconds"
    Data            string
}

其他字段工作正常,因为它们的小写值与集合中的Mongo字段匹配,而TimeoutSeconds正在使用TitleCase。发生的事情是int字段保留为零值,因为Unmarshal无法将字段映射到它。

答案 1 :(得分:0)

当UnMarshalling数据时,有多个支持的键。 以下是一些例子:

type T struct {
    A bool
    B int    "myb"
    C string "myc,omitempty"
    D string `bson:",omitempty" json:"jsonkey"`
    E int64  ",minsize"
    F int64  "myf,omitempty,minsize"
}

编组期间1个键值对的一般规范是:

"[<key>][,<flag1>[,<flag2>]]"

`(...) bson:"[<key>][,<flag1>[,<flag2>]]" (...)` 

GO支持特定关键字,如bson(用于mongo键)和json用于在resposne中设置json键。

查看Marshal GO Reference以获取更多信息。

类似地,有一些框架提供了进一步的选项来定义解析密钥。例如,在sql jinzhu github库中,它支持设置默认值,列ids来映射等。

任何人都可以使用此功能并提供自定义支持。