Golang的MongoDB对象模型 - MGM(Mongo ODM for Go)使用指南
Golang的MongoDB对象模型 - MGM(Mongo ODM for Go)使用指南 Mongo Go Models (mgm) 是开源的,它使得在 Golang 中进行 MongoDB 的查询和聚合操作变得超级简单。
它基于模型,并为所有 CRUD 操作提供了钩子。您可以在所有操作之前或之后执行任何操作。默认情况下,它包含 id、created_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
更多关于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项目,这是一个值得考虑的选择。

