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,所以我宣布EndDatestring。但我需要访问此日期为clientConfigData。请帮忙。

如果您想在编组/编组来自MongoDB的数据时更改值或进行类型转换,可以通过实现自定义编组/解组逻辑来完成。

您可以通过执行bson.Getterbson.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.Getterbson.Setter,所以SetBSON()GetBSON()会被无休止地调用。新的my类型没有这些方法,因此不会发生无穷无尽的“递归”(关键字type创建一个新类型,并且它不会“继承”底层类型的方法)。

另请参阅相关的/类似的问题:Set default date when inserting document with time.Time field

+0

所以如果我们不执行'bson.Getter'和'bson.Setter'我们可以简单地返回'clienConfigData'吧?但在这种情况下,我们最好不要。它是否正确? –

+1

你的问题没有意义,因为添加'GetBSON()'和'SetBSON()'**是实现'Getter'和'Setter'('Getter'和'Setter'是定义'GetBSON )'和'SetBSON()')。如果您不添加这些方法,则不会返回任何内容。 – icza

+0

非常感谢@icza –