Accessing MongoDB from Go



我正在使用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.Getterbson.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.Getterbson.Setter,因此SetBSON()GetBSON()将被无休止地称为。新的my类型没有这些方法,因此不会发生无尽的"递归"(type关键字创建了一种新类型,并且不会"继承"基础类型的方法)。

还请参见相关/类似的问题:设置使用时间插入文档时的默认日期

最新更新