One-time Hooks
go mongox
supports one-time hooks, allowing you to perform actions before and after querying, inserting, deleting, updating, and saving documents.
Insert Operations
After creating an inserter using the Creator()
method, you can register before and after insert hooks by calling the RegisterBeforeHooks
and RegisterAfterHooks
methods.
Inserting a Single Document
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})
You can access the document to be inserted (Doc
) and the *mongo.Collection
object (Col
) via the opContext
parameter.
Inserting Multiple Documents
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},
})
In the RegisterBeforeHooks
and RegisterAfterHooks
methods, you can access the document collection to be inserted (Docs
) and the *mongo.Collection
object (Col
) via the opContext
parameter.
Query Operations
After creating a finder using the Finder()
method, you can register before and after query hooks by calling the RegisterBeforeHooks
and RegisterAfterHooks
methods.
Querying a Single Document
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())
In the RegisterBeforeHooks
method, you can access the query filter (Filter
) and the *mongo.Collection
object (Col
) via the opContext
parameter.
In the RegisterAfterHooks
method, you can access the query filter (Filter
), the query result (Doc
), and the *mongo.Collection
object (Col
) via the opContext
parameter.
Querying Multiple Documents
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())
In the RegisterBeforeHooks
method, you can access the query filter (Filter
) and the *mongo.Collection
object (Col
) via the opContext
parameter.
In the RegisterAfterHooks
method, you can access the query filter (Filter
), the query result (Doc
), and the *mongo.Collection
object (Col
) via the opContext
parameter.
Update Operations
After creating an updater using the Updater()
method, you can register before and after update hooks by calling the RegisterBeforeHooks
and RegisterAfterHooks
methods.
Updating a Single Document
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())
In the RegisterBeforeHooks
and RegisterAfterHooks
methods, you can access the update filter (Filter
), updated document (Updates
), and the *mongo.Collection
object (Col
) via the opContext
parameter.
Updating Multiple Documents
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())
Saving a Document
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())
In the RegisterBeforeHooks
and RegisterAfterHooks
methods, you can access the update filter (Filter
), updated document (Updates
), and the *mongo.Collection
object (Col
) via the opContext
parameter.
Delete Operations
After creating a deleter using the Deleter()
method, you can register before and after delete hooks by calling the RegisterBeforeHooks
and RegisterAfterHooks
methods.
Deleting a Single Document
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())
In the RegisterBeforeHooks
and RegisterAfterHooks
methods, you can access the delete filter (Filter
) and the *mongo.Collection
object (Col
) via the opContext
parameter.
Deleting Multiple Documents
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())
In the RegisterBeforeHooks
and RegisterAfterHooks
methods, you can access the delete filter (Filter
) and the *mongo.Collection
object (Col
) via the opContext
parameter.