我正在使用GO访问mongodb:
var configRes *clientConfigData
err := clientDB.
C(clientConfigCollection).
Find(bson.M{}).
One(&configRes)
if err != nil {
return nil, errors.Wrap(err, "finding config collection")
}
其中
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDate string `bson:"end_date"`
}
现在,由于mongodb中的 EndDate
被存储为 string
,因此我将 EndDate
宣布为 string
。但是我需要访问此日期作为clientConfigData
中的GO Time
。
如果要更改值或进行类型转换时,请在/到MongoDB上宣布您的值时,您可以通过实现自定义套让/删除逻辑来实现。p>您可以通过实现bson.Getter
和bson.Setter
接口来做到这一点。在这些方法中,您可以使用所在的值/未销售的值来做任何您想做的事情。
最简单的是使用其他字段扩展您的clientConfigData
类型,该字段将是类型time.Time
,您需要的值:
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
它具有标签值 bson:"-"
,因为我们不希望它出现在mongodb中。
现在是自定义申请/Unmarhsaling逻辑:
const endDateLayout = "2006-01-02 15:04:05" // Use your layout here
func (c *clientConfigData) SetBSON(raw bson.Raw) (err error) {
type my clientConfigData
if err = raw.Unmarshal((*my)(c)); err != nil {
return
}
c.EndDate, err = time.Parse(endDateLayout, c.EndDateStr)
return
}
func (c *clientConfigData) GetBSON() (interface{}, error) {
c.EndDateStr = c.EndDate.Format(endDateLayout)
type my *clientConfigData
return my(c), nil
}
这里发生的是SetBSON()
负责"填充"您的struct值,其原始值来自MongoDB,而GetBSON()
负责提供您想要保存的值(套)。
加载时:SetBSON()
首先删除值AS,然后正确设置EndDate
字段(即类型time.Time
),从来自DB的string
日期值(EndDateStr
)。
保存时:GetBSON()
首先从EndDate
字段填充EndDateStr
字段(保存的一个字段),然后简单地返回,表示可以保存可以保存。
要注意的一件事:SetBSON()
和GetBSON()
都创建一个新的my
类型。这样做的原因是避免堆栈溢出。仅返回类型clientConfigData
的值是不好的,因为我们实现了bson.Getter
和bson.Setter
,因此SetBSON()
和GetBSON()
将被无休止地称为。新的my
类型没有这些方法,因此不会发生无尽的"递归"(type
关键字创建了一种新类型,并且不会"继承"基础类型的方法)。
还请参见相关/类似的问题:设置使用时间插入文档时的默认日期