如何基于两个Go结构体创建包含子文档的MongoDB文档?
问题原因
你的问题出在User结构体中Profile字段的bson标签上:
Profile *Profile `json:"profile" binding:"required" bson:"profile,inline"`
inline是MongoDB Go驱动的特殊标签,作用是将嵌套结构体的字段平铺到父文档的顶级层级,而非作为子文档存在。这就是为什么插入后first_name和last_name直接出现在根文档里,没有生成profile子文档。
解决方案
只需要去掉bson标签中的,inline参数,让驱动将Profile作为子文档序列化:
修改后的结构体定义:
type User struct { ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"` Email string `json:"email" binding:"required,email" bson:"email"` Profile *Profile `json:"profile" binding:"required" bson:"profile"` // 移除inline参数 } type Profile struct { FirstName string `json:"first_name" binding:"required,min=3" bson:"first_name"` LastName string `json:"last_name" binding:"required" bson:"last_name"` }
优化创建函数
你的CreateUser函数无需手动重新构造Profile对象,直接复用传入的user即可(无额外处理需求时):
func (dbc *Dbc) CreateUser(user *models.User) error { _, err := dbc.GetUserCollection().InsertOne(dbc.ctx, user) return err }
验证效果
修改后插入文档,MongoDB中生成的结构会与你期望的一致:
{ "_id": ObjectId("xxx"), "email": "test@example.com", "profile": { "first_name": "Test", "last_name": "Example" } }
内容的提问来源于stack exchange,提问作者Olaf
相关产品推荐
相关产品推荐

