Golang的MongoDB对象模型 - MGM(Mongo ODM for Go)使用指南

Golang的MongoDB对象模型 - MGM(Mongo ODM for Go)使用指南 Mongo Go Models (mgm) 是开源的,它使得在 Golang 中进行 MongoDB 的查询和聚合操作变得超级简单。

它基于模型,并为所有 CRUD 操作提供了钩子。您可以在所有操作之前或之后执行任何操作。默认情况下,它包含 idcreated_at(自动填充)和 updated_at(自动更新)字段(您可以更改此行为)。

配置 Mongo 的 Go 驱动程序非常容易。

所有 Mongo 操作符都已预定义,因此您无需硬编码它们。

这是首个针对官方 Mongo Go 驱动程序的 Golang ODM 包装器。

请尝试一下,并告诉我们您的想法!


更多关于Golang的MongoDB对象模型 - MGM(Mongo ODM for Go)使用指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang的MongoDB对象模型 - MGM(Mongo ODM for Go)使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


MGM确实是一个优秀的MongoDB ODM库,它简化了Golang与MongoDB的交互。以下是一个完整的使用示例:

package main

import (
    "context"
    "time"
    "github.com/kamva/mgm/v3"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo/options"
)

// 定义模型结构体
type User struct {
    mgm.DefaultModel `bson:",inline"`
    Name             string `bson:"name"`
    Email            string `bson:"email"`
    Age              int    `bson:"age"`
}

// 创建前的钩子
func (model *User) Creating() error {
    model.CreatedAt = time.Now()
    model.UpdatedAt = time.Now()
    return nil
}

// 更新前的钩子
func (model *User) Updating() error {
    model.UpdatedAt = time.Now()
    return nil
}

func main() {
    // 初始化连接
    err := mgm.SetDefaultConfig(&mgm.Config{
        CtxTimeout: 5 * time.Second,
    }, "my-db", options.Client().ApplyURI("mongodb://localhost:27017"))
    if err != nil {
        panic(err)
    }

    // 创建用户
    user := &User{
        Name:  "John Doe",
        Email: "john@example.com",
        Age:   30,
    }
    
    // 保存到数据库
    err = mgm.Coll(user).Create(user)
    if err != nil {
        panic(err)
    }

    // 查询单个文档
    foundUser := &User{}
    err = mgm.Coll(foundUser).FindByID(user.ID, foundUser)
    if err != nil {
        panic(err)
    }

    // 更新文档
    user.Age = 31
    err = mgm.Coll(user).Update(user)
    if err != nil {
        panic(err)
    }

    // 使用Mongo操作符进行查询
    var users []User
    err = mgm.Coll(&User{}).SimpleFind(
        &users,
        bson.M{
            "age": bson.M{mgm.OptrGte: 25},
            "name": bson.M{mgm.OptrRegex: "John", mgm.OptrOptions: "i"},
        },
    )
    if err != nil {
        panic(err)
    }

    // 聚合查询
    pipeline := []bson.M{
        {
            mgm.AggregateGroup: bson.M{
                "_id": "$age_group",
                "count": bson.M{mgm.AggregateSum: 1},
            },
        },
    }
    
    cursor, err := mgm.Coll(&User{}).Aggregate(mgm.Ctx(), pipeline)
    if err != nil {
        panic(err)
    }
    defer cursor.Close(mgm.Ctx())

    // 删除文档
    err = mgm.Coll(user).Delete(user)
    if err != nil {
        panic(err)
    }
}

MGM的预定义操作符让查询更加清晰:

// 使用预定义操作符
filter := bson.M{
    "age": bson.M{mgm.OptrGt: 20, mgm.OptrLt: 40},
    "created_at": bson.M{mgm.OptrGte: time.Now().Add(-24 * time.Hour)},
    mgm.OptrOr: []bson.M{
        {"name": "John"},
        {"email": bson.M{mgm.OptrRegex: "gmail.com$"}},
    },
}

自动时间戳管理是MGM的一大亮点,created_at和updated_at字段会自动维护。钩子机制允许在操作前后执行自定义逻辑,比如数据验证或日志记录。

MGM与官方Mongo Go驱动完全兼容,所有底层功能都可用,同时提供了更简洁的API。对于需要复杂MongoDB操作的Golang项目,这是一个值得考虑的选择。

回到顶部