postman 为什么Go语言结构体中的数组字段在插入mongoDB数据库时默认为null?

5rgfhyps  于 2022-11-07  发布在  Postman
关注(0)|答案(1)|浏览(149)

因此,在向mongoDB插入模型时,我遇到了一些意外的行为。当我通过Postman向服务器发送一个空主体并将其插入数据库时,Postman的返回结果是namenumber默认为它们预期的默认值0"",但对于data,不是默认为空数组,在插入之前给data字段赋值一个空的[]int{}就可以解决这个问题,同样,从Postman手动发送一个空数组作为数据字段也可以解决这个问题。但我很好奇是否有其他方法可以保证数组字段在插入时默认为[]而不是null
下面是我的模型:

type Test struct{
    Name string `json:"name"   bson:"name"`
    Number int  `json:"number" bson:"number"`
    Data []int  `json:"data"   bson:"data"`
}
x8diyxa7

x8diyxa71#

实现bson.Marshaler,保存值时将调用MarshalBSON()函数

package main

import (
    "log"

    "go.mongodb.org/mongo-driver/bson"
)

type Test struct {
    Data []int `json:"data" bson:"data"`
}

func (t *Test) MarshalBSON() ([]byte, error) {
    if t.Data == nil {
        log.Println("t.Data is nil")
        t.Data = make([]int, 0)
    }

    type my Test
    return bson.Marshal((*my)(t))
}

func main() {
    h := Test{}
    data, _ := bson.Marshal(&h)
    log.Print(bson.Raw(data))
}

// output: 
// 2009/11/10 23:00:00 t.Data is nil
// 2009/11/10 23:00:00 {"data": []}

演示围棋游戏场链接:https://go.dev/play/p/1WlO_44hnco
此外,您还可以查看以下链接:Autofill created_at and updated_at in golang struct while pushing into mongodb

相关问题