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.