You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:32:34