我正在查询一个包含其值中的整数值的集合,并将结果文档加载到此结构中:
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类型有什么问题?
答案 0 :(得分:4)
您是否尝试过设置该字段的“密钥”值?
小写字段名称用作每个导出字段的键, 但是可以使用相应的字段标记更改此行为。
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来映射等。
任何人都可以使用此功能并提供自定义支持。