Nếu bạn muốn thay đổi một giá trị hoặc thực hiện chuyển đổi kiểu khi sắp xếp / bỏ quản lý các giá trị của mình từ / sang MongoDB, bạn có thể thực hiện việc đó bằng cách triển khai logic sắp xếp / bỏ quản lý tùy chỉnh.
Bạn có thể thực hiện việc này bằng cách triển khai bson.Getter
và bson.Setter
các giao diện. Bên trong các phương thức này, bạn có thể làm bất cứ điều gì bạn muốn với các giá trị được sắp xếp / không được phân chia.
Dễ nhất là mở rộng clientConfigData
của bạn nhập với một trường bổ sung, một trường sẽ thuộc loại time.Time
, giá trị bạn cần:
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
Nó có giá trị thẻ bson:"-"
, bởi vì chúng tôi không muốn điều này xuất hiện trong MongoDB.
Và bây giờ là logic sắp xếp / hủy định vị trí tùy chỉnh:
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
}
Điều gì xảy ra ở đây là SetBSON()
chịu trách nhiệm "điền" giá trị cấu trúc của bạn với giá trị thô đến từ MongoDB và GetBSON()
có trách nhiệm cung cấp một giá trị mà bạn muốn được lưu lại (được sắp xếp theo nguyên tắc).
Khi tải:SetBSON()
trước tiên hãy giải nén giá trị nguyên trạng, sau đó đặt đúng EndDate
trường (thuộc loại time.Time
) từ chuỗi string
giá trị ngày đến từ DB (EndDateStr
).
Khi lưu:GetBSON()
trước tiên hãy điền vào EndDateStr
(trường được lưu) từ EndDate
và sau đó chỉ cần trả về, báo hiệu rằng có thể lưu.
Một điều cần lưu ý:cả SetBSON()
và GetBSON()
tạo một my
mới gõ bên trong chúng. Lý do cho điều này là để tránh tràn ngăn xếp. Chỉ cần trả về giá trị kiểu clientConfigData
không tốt, vì chúng tôi đã triển khai bson.Getter
và bson.Setter
, vì vậy SetBSON()
và GetBSON()
sẽ được gọi là vô tận. my
mới loại không có các phương thức này, vì vậy "đệ quy" vô tận không xảy ra (loại string
từ khóa tạo ra một kiểu mới và nó không "kế thừa" các phương thức của kiểu cơ bản).
Cũng xem câu hỏi liên quan / tương tự:Đặt ngày mặc định khi chèn tài liệu với trường thời gian.