Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengisi Medan `created_at` dan `updated_at` secara automatik dalam Go Structs Sebelum Sisipan MongoDB?

Bagaimana untuk Mengisi Medan `created_at` dan `updated_at` secara automatik dalam Go Structs Sebelum Sisipan MongoDB?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-24 19:08:11215semak imbas

How to Automatically Populate `created_at` and `updated_at` Fields in Go Structs Before MongoDB Insertion?

Autofill created_at dan updated_at dalam Go Struct Sebelum Memasukkan ke dalam MongoDB

Apabila memasukkan struct ke dalam koleksi MongoDB menggunakan pemacu MongoDB untuk Go, medan created_at dan updated_at adalah ditetapkan kepada masa sifar (0001-01-01T00:00:00.000 00:00). Ini mungkin bukan tingkah laku yang diingini, terutamanya jika medan ini dijangka menyimpan masa sebenar penciptaan dan pengubahsuaian.

Marshaler Tersuai

Pelayan MongoDB tidak menyokong pengisian automatik create_at dan kemas kini_di medan. Walau bagaimanapun, anda boleh melaksanakan fungsi ini dengan mencipta marshaler tersuai.

Melaksanakan bson.Marshaler

Melaksanakan antara muka bson.Marshaler untuk jenis Pengguna anda. Ini akan membolehkan anda menyesuaikan cara struct dimarshallkan ke dalam BSON sebelum dimasukkan ke dalam pangkalan data.

Kaedah MarshalBSON marshaler tersuai anda harus melakukan langkah berikut:

  1. If CreatedAt ialah sifar, tetapkannya kepada masa semasa.
  2. Tetapkan UpdatedAt kepada semasa masa.
  3. Marshal struct ke dalam BSON menggunakan bson asas. Fungsi Marshal.

Berikut ialah contoh marshaler tersuai:

func (user *User) MarshalBSON() ([]byte, error) {
    if user.CreatedAt.IsZero() {
        user.CreatedAt = time.Now()
    }
    user.UpdatedAt = time.Now()

    type my User
    return bson.Marshal((*my)(user))
}

Penggunaan

Untuk menggunakan marshaler tersuai, ingat untuk menggunakannya di mana sahaja anda memasukkan struct Pengguna ke dalam pangkalan data menggunakan Kaedah InsertOne. Anda mesti menghantar penunjuk kepada struct Pengguna sebagai hujah.

Contoh:

user := &User{Name: "username"}

c := client.Database("db").Collection("collection")
if _, err := c.InsertOne(context.Background(), user); err != nil {
    // handle error
}

Perhatikan bahawa marshaler tersuai tidak akan berfungsi jika anda membenamkannya ke dalam struct yang lebih besar. Untuk mengelakkan isu ini, anda boleh menggunakan marshaler tersuai untuk keseluruhan struct terbenam sebaliknya.

Atas ialah kandungan terperinci Bagaimana untuk Mengisi Medan `created_at` dan `updated_at` secara automatik dalam Go Structs Sebelum Sisipan MongoDB?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn