在插入带有时间的文档时设置默认日期。时间字段

猫鼬</ code>( node.js </ code>)中,我可以定义 具有默认 Date.now </ code>的模型架构,如下所示:</ p>

  ... 
type:Date,
default:Date.now
。 ..
</ code> </ pre>

如何在每次使用创建文档时都不必插入 time.Time </ code>的情况下实现相同的效果 mgo </ code>?</ p>

  type用户结构{
CreatedAt time.Timejson:“ created_at” bson:“ created_at”// //将该字段自动填充为 time.Now()每次插入此“结构”的文档
}
</ code> </ pre>
</ div>

展开原文

原文

In mongoose(node.js) I can define a model schema with a default Date.now like so:

...
type: Date,
default: Date.now
...

How do I achieve the same without having to insert the time.Time every time I create a document with mgo?

type User struct {
    CreatedAt   time.Time `json:"created_at" bson:"created_at"` // Make this field filled automatically with time.Now() every time a document of this `struct` is inserted
}

1个回答

In Go you can't define default values for fields, they will always be the zero-value of their type when a new struct value is created (unless you use a composite literal where you can give a different value explicitly).

So one option would be to create a constructor-like function NewUser() which would set this field, and use always this function to create new users:

func NewUser() *User {
    return &User{
        CreatedAt: time.Now(),
    }
}

Of course this can't be forced, and also this will hold the timestamp of the User struct value creation and not when it is saved.

Another, better approach is to use a custom marshaling logic.

You can write custom marshaling logic by implementing bson.Getter. GetBSON() is responsible to provide a value that will actually be saved. We want the same User instance to be saved, just its CreatedAt field set prior:

type User struct {
    CreatedAt time.Time `json:"created_at" bson:"created_at"`
}

func (u *User) GetBSON() (interface{}, error) {
    u.CreatedAt = time.Now()
    type my *User
    return my(u), nil
}

Note that a new my type is created and returned. The reason for this is to avoid stack overflow. Simply returning a value of type *User is bad, because it implements bson.Getter, so GetBSON() would get called endlessly. The new my type does not have this method, so endless "recursion" does not happen (the type keyword creates a new type, and it does not "inherit" methods of the underlying type).

Note that this solution will also overwrite (re-set) the CreatedAt field) even if you just want to re-save a User. So we should add a check whether the CreatedAt field is filled, and only set it if it's the zero value:

func (u *User) GetBSON() (interface{}, error) {
    if u.CreatedAt.IsZero() {
        u.CreatedAt = time.Now()
    }
    type my *User
    return my(u), nil
}

Also see related / similar question: Accesing MongoDB from Go

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐