Go嵌套结构体无法被忽略,插入Mongo仍存null值问题排查
问题原因与解决方法
你的问题核心在于混淆了JSON标签和BSON标签的作用:
- 你给
Product字段加的json:"product,omitempty"仅在Go的encoding/json包处理JSON编解码时生效,但插入MongoDB时,依赖的是MongoDB驱动的BSON序列化逻辑,该逻辑只识别bson标签,完全不会理会json标签的omitempty规则。 - 当请求Payload中没有
product字段时,JSON解码后B结构体的Product字段会是nil指针(因为是指针类型),MongoDB驱动默认会把nil指针序列化成null字段存入数据库,除非你给它加上bson:"product,omitempty"标签,明确告诉驱动当字段为nil时忽略它。
修正后的结构体定义
import "go.mongodb.org/mongo-driver/bson" type A struct { Title string `json:"title" bson:"title"` Text string `json:"text" bson:"text"` Data B `json:"data" bson:"data"` } type B struct { Product *C `json:"product,omitempty" bson:"product,omitempty"` ExternalLink string `json:"external_link,omitempty" bson:"external_link,omitempty"` } type C struct { Name string `json:"name" bson:"name"` Id int `json:"id" bson:"id"` }
额外优化建议
你的NewMessage函数可以调整初始化方式,避免潜在的nil指针问题,同时建议处理解码错误:
func NewMessage(req *http.Request) (*A, error) { newMessage := &A{} err := json.NewDecoder(req.Body).Decode(newMessage) return newMessage, err }
这样修改后,当请求里没有product字段时,MongoDB的文档里就不会出现product: null了。
内容的提问来源于stack exchange,提问作者Maaz
相关产品推荐
相关产品推荐

