2017-01-28 11 views
1

В mongoose (node.js) я могу определить модель схему с дефолтом Date.now следующим образом:Установки дата по умолчанию при вставке документа с полем time.Time

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

Как добиться тем же, без необходимости вставить time.Time каждый раз, когда я создаю документ с 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

В Go вы не можете определить значения по умолчанию для полей, они всегда будут zero-value их типа, когда создается новое значение структура (если вы не используете composite literal, где вы можете дать другое значение явно) ,

Так один из вариантов было бы создать конструктор, как функция NewUser(), которая будет установлена ​​в этом поле, и всегда использовать эту функцию для создания новых пользователей:

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

Конечно, это не может быть принужден, и также это будет содержать временную метку создания значения структуры User, а не когда она будет сохранена.

Другим, лучшим подходом является использование пользовательской логики маршалинга.

Вы можете написать собственную логику маршалинга, реализовав bson.Getter. GetBSON() несет ответственность за предоставление значения, которое фактически будет сохранено. Мы хотим, чтобы то же самое User экземпляра, чтобы спастись, только его CreatedAt поля устанавливается до:

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 
} 

Обратите внимание, что новый my типа создаются и возвращается. Причина этого заключается в том, чтобы избежать переполнения стека. Просто возврат значения типа *User является плохим, потому что он реализует bson.Getter, поэтому GetBSON() будет называться бесконечно. Новый тип my не имеет этого метода, поэтому бесконечной «рекурсии» не происходит (ключевое слово type создает новый тип и не наследует методы базового типа).

Обратите внимание, что это решение также перезапишет (переустановит) поле CreatedAt), даже если вы просто хотите сохранить резервную копию User. Таким образом, мы должны добавить проверку заполнен ли CreatedAt поле, и только установить его, если это нулевое значение:

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

Также см связаны/аналогичный вопрос: Accesing MongoDB from Go

 Смежные вопросы

  • Нет связанных вопросов^_^