Golang中使用MongoDB实现一对多数据库插入

Golang中使用MongoDB实现一对多数据库插入 以下是两个模型:用户(User)和物品(Item)

type User struct {
    ID        primitive.ObjectID   `json:"id" bson:"_id,omitempty"`
    Email     string        `json:"email,omitempty" bson:"email,omitempty"`
    FirstName string        `json:"firstName,omitempty" bson:"firstName,omitempty"`
    LastName  string        `json:"lastName,omitempty" bson:"lastName,omitempty"`
    Password  string        `json:"password,omitempty" bson:"password,omitempty"`
    Item      Item          `json:"item,omitempty" bson:"item,omitempty"`
}

type Item struct {
    ID          primitive.ObjectID `json:"id,omitempty" bson:"_id,omitempty"`
    Category    string             `json:"category,omitempty" bson:"category,omitempty"`
    Name        string             `json:"name,omitempty" bson:"name,omitempty"`
    Description string             `json:"description,omitempty" bson:"description,omitempty"`
    Price       int                `json:"price,omitempty" bson:"price,omitempty"`
}

我已经在物品(Item)集合中插入了许多样本数据。 如何通过为其提供物品详情,将数据插入到用户(User)集合中。


更多关于Golang中使用MongoDB实现一对多数据库插入的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

我已经向 Item 集合中插入了许多样本。 如何通过向它提供项目详细信息来将数据插入到用户集合中。

我不确定我是否理解了这个问题,但一对多表示一种“关系”。使用关系型数据库(如 PostgreSQL、MySQL 等)应该能更简单地实现表之间的关系。

更多关于Golang中使用MongoDB实现一对多数据库插入的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go中向MongoDB插入一对多关系数据,通常有两种设计模式:嵌入文档或引用文档。根据你的模型结构,User中只包含单个Item,这是一对一关系。要实现一对多,需要将Item字段改为切片类型。

以下是修改后的模型和插入示例:

type User struct {
    ID        primitive.ObjectID   `json:"id" bson:"_id,omitempty"`
    Email     string               `json:"email,omitempty" bson:"email,omitempty"`
    FirstName string               `json:"firstName,omitempty" bson:"firstName,omitempty"`
    LastName  string               `json:"lastName,omitempty" bson:"lastName,omitempty"`
    Password  string               `json:"password,omitempty" bson:"password,omitempty"`
    Items     []Item               `json:"items,omitempty" bson:"items,omitempty"` // 改为切片实现一对多
}

type Item struct {
    ID          primitive.ObjectID `json:"id,omitempty" bson:"_id,omitempty"`
    Category    string             `json:"category,omitempty" bson:"category,omitempty"`
    Name        string             `json:"name,omitempty" bson:"name,omitempty"`
    Description string             `json:"description,omitempty" bson:"description,omitempty"`
    Price       int                `json:"price,omitempty" bson:"price,omitempty"`
}

嵌入文档方式插入:

func InsertUserWithItems(client *mongo.Client, user User) (*mongo.InsertOneResult, error) {
    collection := client.Database("yourdb").Collection("users")
    
    // 为每个Item生成ID(如果未提供)
    for i := range user.Items {
        if user.Items[i].ID.IsZero() {
            user.Items[i].ID = primitive.NewObjectID()
        }
    }
    
    result, err := collection.InsertOne(context.Background(), user)
    return result, err
}

// 使用示例
user := User{
    Email:     "john@example.com",
    FirstName: "John",
    LastName:  "Doe",
    Password:  "hashed_password",
    Items: []Item{
        {
            Category:    "Electronics",
            Name:        "Laptop",
            Description: "Gaming laptop",
            Price:       1200,
        },
        {
            Category:    "Books",
            Name:        "Go Programming",
            Description: "Learn Go programming",
            Price:       45,
        },
    },
}

result, err := InsertUserWithItems(client, user)

引用文档方式(如果Items已存在独立集合):

type UserWithReferences struct {
    ID        primitive.ObjectID   `json:"id" bson:"_id,omitempty"`
    Email     string               `json:"email,omitempty" bson:"email,omitempty"`
    FirstName string               `json:"firstName,omitempty" bson:"firstName,omitempty"`
    LastName  string               `json:"lastName,omitempty" bson:"lastName,omitempty"`
    Password  string               `json:"password,omitempty" bson:"password,omitempty"`
    ItemIDs   []primitive.ObjectID `json:"itemIds,omitempty" bson:"itemIds,omitempty"` // 存储Item的ID引用
}

func InsertUserWithItemReferences(client *mongo.Client, user UserWithReferences) (*mongo.InsertOneResult, error) {
    collection := client.Database("yourdb").Collection("users")
    result, err := collection.InsertOne(context.Background(), user)
    return result, err
}

// 使用示例(假设已有Item的ID)
itemID1, _ := primitive.ObjectIDFromHex("60d5f8c5e4b0e8a9d4f8b5a1")
itemID2, _ := primitive.ObjectIDFromHex("60d5f8c5e4b0e8a9d4f8b5a2")

user := UserWithReferences{
    Email:     "jane@example.com",
    FirstName: "Jane",
    LastName:  "Smith",
    Password:  "hashed_password",
    ItemIDs:   []primitive.ObjectID{itemID1, itemID2},
}

result, err := InsertUserWithItemReferences(client, user)

批量插入多个用户:

func InsertMultipleUsers(client *mongo.Client, users []User) (*mongo.InsertManyResult, error) {
    collection := client.Database("yourdb").Collection("users")
    
    // 转换接口切片
    docs := make([]interface{}, len(users))
    for i, user := range users {
        // 为每个用户的Items生成ID
        for j := range user.Items {
            if user.Items[j].ID.IsZero() {
                user.Items[j].ID = primitive.NewObjectID()
            }
        }
        docs[i] = user
    }
    
    result, err := collection.InsertMany(context.Background(), docs)
    return result, err
}

嵌入文档方式适合子文档数量有限且不频繁独立查询的场景。引用文档方式适合子文档数量大、需要独立更新或跨文档查询的场景。根据你的具体需求选择合适的设计模式。

回到顶部