Accesing的MongoDB从围棋
我使用转到如下访问的MongoDB:Accesing的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
。请帮忙。
如果您想在编组/编组来自MongoDB的数据时更改值或进行类型转换,可以通过实现自定义编组/解组逻辑来完成。
您可以通过执行bson.Getter
和bson.Setter
接口来完成此操作。在这些方法里面,你可以做任何你想要的值,这些值是封送/解组的。
最简单的就是用一个附加字段,一个将time.Time
类型的扩展您clientConfigData
类型,值需要:
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()
负责人向“填充”的结构值从MongoDB中来的原始值,并且GetBSON()
负责提供你想要保存的值(编组)。
当装载:与从DB(EndDateStr
)附带的string
日期值SetBSON()
第一解组原样,然后适当地设置EndDate
场(是time.Time
类型的)的值。
保存时:GetBSON()
首先从EndDate
场充满EndDateStr
场(即保存在一个),然后简单地返回,这表明它是确定保存。
有一点需要注意:SetBSON()
和GetBSON()
都在里面创建了一个新的my
类型。这是为了避免堆栈溢出。简单地返回clientConfigData
类型的值是不好的,因为我们实现了bson.Getter
和bson.Setter
,所以SetBSON()
和GetBSON()
会被无休止地调用。新的my
类型没有这些方法,因此不会发生无穷无尽的“递归”(关键字type
创建一个新类型,并且它不会“继承”底层类型的方法)。
另请参阅相关的/类似的问题:Set default date when inserting document with time.Time field
所以如果我们不执行'bson.Getter'和'bson.Setter'我们可以简单地返回'clienConfigData'吧?但在这种情况下,我们最好不要。它是否正确? –
你的问题没有意义,因为添加'GetBSON()'和'SetBSON()'**是实现'Getter'和'Setter'('Getter'和'Setter'是定义'GetBSON )'和'SetBSON()')。如果您不添加这些方法,则不会返回任何内容。 – icza
非常感谢@icza –