一次性钩子
go mongox
支持一次性钩子,你可以在查询、插入、删除、更新和保存文档的前后执行一些操作。
插入操作
使用 Creator()
方法创建一个插入器之后,通过调用 RegisterBeforeHooks
和 RegisterAfterHooks
方法注册插入前和插入后的钩子函数。
插入单个文档
insertOneResult, err := userColl.Creator().
RegisterBeforeHooks(func(ctx context.Context, opContext *creator.OpContext[User], opts ...any) error {
fmt.Println("BeforeHook called")
fmt.Println(opContext.Doc)
fmt.Println(opContext.Col != nil)
return nil
}).
RegisterAfterHooks(func(ctx context.Context, opContext *creator.OpContext[User], opts ...any) error {
fmt.Println("AfterHook called")
fmt.Println(opContext.Doc)
fmt.Println(opContext.Col != nil)
return nil
}).
InsertOne(context.Background(), &User{Name: "Mingyong Chen", Age: 18})
通过 opContext
参数可以获取到插入操作的文档 Doc
和 *mongo.Collection
对象 Col
。
插入多个文档
insertManyResult, err := userColl.Creator().
RegisterBeforeHooks(func(ctx context.Context, opContext *creator.OpContext[User], opts ...any) error {
fmt.Println("BeforeHook called")
fmt.Println(opContext.Docs)
fmt.Println(opContext.Col != nil)
return nil
}).
RegisterAfterHooks(func(ctx context.Context, opContext *creator.OpContext[User], opts ...any) error {
fmt.Println("AfterHook called")
fmt.Println(opContext.Docs)
fmt.Println(opContext.Col != nil)
return nil
}).
InsertMany(context.Background(), []*User{
{Name: "Mingyong Chen", Age: 18},
{Name: "Burt", Age: 18},
})
在RegisterBeforeHooks
和 RegisterAfterHooks
方法中,通过 opContext
参数可以获取到插入操作的文档集合 Docs
和 *mongo.Collection
对象 Col
。
查询操作
使用 Finder()
方法创建一个查询器之后,通过调用 RegisterBeforeHooks
和 RegisterAfterHooks
方法注册查询前和查询后的钩子函数。
查询单个文档
user, err := userColl.Finder().
RegisterBeforeHooks(func(ctx context.Context, opContext *finder.OpContext, opts ...any) error {
fmt.Println("BeforeHook called")
fmt.Println(opContext.Filter)
return nil
}).
RegisterAfterHooks(func(ctx context.Context, opContext *finder.AfterOpContext[User], opts ...any) error {
fmt.Println("AfterHook called")
fmt.Println(opContext.Filter)
fmt.Println(opContext.Doc)
return nil
}).
Filter(query.Eq("name", "Mingyong Chen")).
FindOne(context.Background())
在 RegisterBeforeHooks
方法中,通过 opContext
参数可以获取到查询操作的过滤条件 Filter
和 *mongo.Collection
对象 Col
。
在 RegisterAfterHooks
方法中,通过 opContext
参数可以获取到查询操作的过滤条件 Filter
和查询结果 Doc
以及 *mongo.Collection
对象 Col
。
查询多个文档
users, err := userColl.Finder().
RegisterBeforeHooks(func(ctx context.Context, opContext *finder.OpContext, opts ...any) error {
fmt.Println("BeforeHook called")
fmt.Println(opContext.Filter)
fmt.Println(opContext.Col != nil)
return nil
}).
RegisterAfterHooks(func(ctx context.Context, opContext *finder.AfterOpContext[User], opts ...any) error {
fmt.Println("AfterHook called")
fmt.Println(opContext.Filter)
fmt.Println(opContext.Docs)
fmt.Println(opContext.Col != nil)
return nil
}).
Filter(query.In("name", "Mingyong Chen", "chenmingyong")).
Find(context.Background())
在 RegisterBeforeHooks
方法中,通过 opContext
参数可以获取到查询操作的过滤条件 Filter
和 *mongo.Collection
对象 Col
。
在 RegisterAfterHooks
方法中,通过 opContext
参数可以获取到查询操作的过滤条件 Filter
和查询结果 Docs
以及 *mongo.Collection
对象 Col
。
更新操作
使用 Updater()
方法创建一个更新器之后,通过调用 RegisterBeforeHooks
和 RegisterAfterHooks
方法注册更新前和更新后的钩子函数。
更新单个文档
updateResult, err := userColl.Updater().
RegisterBeforeHooks(func(ctx context.Context, opContext *updater.BeforeOpContext, opts ...any) error {
fmt.Println("BeforeHook called")
fmt.Println(opContext.Filter)
fmt.Println(opContext.Updates)
fmt.Println(opContext.Col != nil)
return nil
}).
RegisterAfterHooks(func(ctx context.Context, opContext *updater.AfterOpContext, opts ...any) error {
fmt.Println("AfterHook called")
fmt.Println(opContext.Filter)
fmt.Println(opContext.Updates)
fmt.Println(opContext.Col != nil)
return nil
}).
Filter(query.Eq("name", "Mingyong Chen")).
Updates(update.Set("age", 6)).
UpdateOne(context.Background())
在 RegisterBeforeHooks
和 RegisterAfterHooks
方法中,通过 opContext
参数可以获取到更新操作的过滤条件 Filter
和更新的文档 Updates
以及 *mongo.Collection
对象 Col
。
更新多个文档
updateResult, err := userColl.Updater().
RegisterBeforeHooks(func(ctx context.Context, opContext *updater.BeforeOpContext, opts ...any) error {
fmt.Println("BeforeHook called")
fmt.Println(opContext.Filter)
fmt.Println(opContext.Updates)
fmt.Println(opContext.Col != nil)
return nil
}).
RegisterAfterHooks(func(ctx context.Context, opContext *updater.AfterOpContext, opts ...any) error {
fmt.Println("AfterHook called")
fmt.Println(opContext.Filter)
fmt.Println(opContext.Updates)
fmt.Println(opContext.Col != nil)
return nil
}).
Filter(query.In("name", "Mingyong Chen", "chenmingyong")).
Updates(update.Set("age", 6)).
UpdateMany(context.Background())
在 RegisterBeforeHooks
和 RegisterAfterHooks
方法中,通过 opContext
参数可以获取到更新操作的过滤条件 Filter
和更新的文档 Updates
以及 *mongo.Collection
对象 Col
。
保存文档
updateResult, err := userColl.Updater().
RegisterBeforeHooks(func(ctx context.Context, opContext *updater.BeforeOpContext, opts ...any) error {
fmt.Println("BeforeHook called")
fmt.Println(opContext.Filter)
fmt.Println(opContext.Updates)
fmt.Println(opContext.Col != nil)
return nil
}).
RegisterAfterHooks(func(ctx context.Context, opContext *updater.AfterOpContext, opts ...any) error {
fmt.Println("AfterHook called")
fmt.Println(opContext.Filter)
fmt.Println(opContext.Updates)
fmt.Println(opContext.Col != nil)
return nil
}).
Filter(query.Eq("name", "Mingyong Chen")).
Updates(update.Set("age", 18)).
Upsert(context.Background())
在 RegisterBeforeHooks
和 RegisterAfterHooks
方法中,通过 opContext
参数可以获取到保存操作的过滤条件 Filter
和更新的文档 Updates
以及 *mongo.Collection
对象 Col
。
删除操作
使用 Deleter()
方法创建一个删除器之后,通过调用 RegisterBeforeHooks
和 RegisterAfterHooks
方法注册删除前和删除后的钩子函数。
删除单个文档
deleteResult, err := userColl.Deleter().
RegisterBeforeHooks(func(ctx context.Context, opContext *deleter.OpContext, opts ...any) error {
fmt.Println("BeforeHook called")
fmt.Println(opContext.Filter)
fmt.Println(opContext.Col != nil)
return nil
}).
RegisterAfterHooks(func(ctx context.Context, opContext *deleter.OpContext, opts ...any) error {
fmt.Println("AfterHook called")
fmt.Println(opContext.Filter)
fmt.Println(opContext.Col != nil)
return nil
}).
Filter(query.Eq("name", "Mingyong Chen")).
DeleteOne(context.Background())
在 RegisterBeforeHooks
和 RegisterAfterHooks
方法中,通过 opContext
参数可以获取到删除操作的过滤条件 Filter
和 *mongo.Collection
对象 Col
。
删除多个文档
deleteResult, err := userColl.Deleter().
RegisterBeforeHooks(func(ctx context.Context, opContext *deleter.BeforeOpContext, opts ...any) error {
fmt.Println("BeforeHook called")
fmt.Println(opContext.Filter)
fmt.Println(opContext.Col != nil)
return nil
}).
RegisterAfterHooks(func(ctx context.Context, opContext *deleter.AfterOpContext, opts ...any) error {
fmt.Println("AfterHook called")
fmt.Println(opContext.Filter)
fmt.Println(opContext.Col != nil)
return nil
}).
Filter(query.In("name", "Mingyong Chen", "Burt")).
DeleteMany(context.Background())
在 RegisterBeforeHooks
和 RegisterAfterHooks
方法中,通过 opContext
参数可以获取到删除操作的过滤条件 Filter
和 *mongo.Collection
对象 Col
。