- Notifications
You must be signed in to change notification settings - Fork5
The implementation of the interfaces for the official MongoDB driver in Go
License
sv-tools/mongoifc
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
The Interfaces for theMongoDB driver.
go get -u github.com/sv-tools/mongoifc/v2
Themongoifc code is stabilized, so now the version will match the version of the MongoDB driver sincev1.8.0.
In case of need for bug fixes inmongoifc, the version will be in this formatv1.8.1+N, wherev1.8.1 is theversion of MongoDB driver andN is a patch ofmongoifc. The new version for changes in README.md, tests, examples,GitHub workflows is not required.
It is not a simple drop in replacement because of the limitations in Go. You should rewrite your code to use thislibrary instead of mongo driver.
conn:= mongoifc.Connect(...)
instead of
conn:= mongo.Connect(...)
or if you have a special code that returns the mongo object then you need to use one ofWrap functions to wrapthemongo.Client ormongo.Database ormongo.Collection ormongo.Session objects:
orig:= mongo.Connect(...)...conn:= mongoifc.WrapClient(orig)
or
funcGetTenantDB(ctx context.Context,tenantID,dbNamestring) (*mongo.Database,error) {// a code that returns a special database for a given tenant and database name}...orig,err:=GetTenantDB(ctx,tenant,"users")iferr!=nil {...}db=mongoifc.WrapDatabase(orig)
Now let's dig a bit into the limitations. Assume that you have a function to return a list of admin users, and yourewrote it usingmongoifc:
package users// Original: func GetAdmins(ctx context.Context, db *mongo.Database) ([]*User, error)funcGetAdmins(ctx context.Context,db mongoifc.Database) ([]User,error) {varusers []Usercur,err:=db.Collection(UsersCollection).Find(ctx,User{Active:true,IsAdmin:true,})iferr!=nil {returnnil,err}iferr:=cur.All(ctx,&users);err!=nil {returnnil,err}returnusers,err}
and if you pass an object of*mongo.Database type instead ofmongoifc.Database
conn,_:= mongo.Connect(context.Background(),...)db:= conn.Database(...)users.GetAdmins(context.Background(),db)
then compilation fails with such error:
cannot use db (type *mongo.Database) as type mongoifc.Database in argument to simple.GetAdmins: *mongo.Database does not implement mongoifc.Database (wrong type for Aggregate method) have Aggregate(context.Context, interface {}, ...*"go.mongodb.org/mongo-driver/mongo/options".AggregateOptions) (*mongo.Cursor, error) want Aggregate(context.Context, interface {}, ...*"go.mongodb.org/mongo-driver/mongo/options".AggregateOptions) (mongoifc.Cursor, error)This is the main reason of wrapping the original objects and using themongoifc instead.
- ChangeStream:https://pkg.go.dev/go.mongodb.org/mongo-driver/v2/mongo#ChangeStream
- Client:https://pkg.go.dev/go.mongodb.org/mongo-driver/v2/mongo#Client
- ClientEncryption:https://pkg.go.dev/go.mongodb.org/mongo-driver/v2/mongo#ClientEncryption
- Collection:https://pkg.go.dev/go.mongodb.org/mongo-driver/v2/mongo#Collection
- Cursor:https://pkg.go.dev/go.mongodb.org/mongo-driver/v2/mongo#Cursor
- Database:https://pkg.go.dev/go.mongodb.org/mongo-driver/v2/mongo#Database
- IndexView:https://pkg.go.dev/go.mongodb.org/mongo-driver/v2/mongo#IndexView
- Session:https://pkg.go.dev/go.mongodb.org/mongo-driver/v2/mongo#Session
- SingleResult:https://pkg.go.dev/go.mongodb.org/mongo-driver/v2/mongo#SingleResult
- DistinctResult:https://pkg.go.dev/go.mongodb.org/mongo-driver/v2/mongo#DistinctResult
- GridFSBucket:https://pkg.go.dev/go.mongodb.org/mongo-driver/v2/mongo#GridFSBucket
- GridFSUploadStream:https://pkg.go.dev/go.mongodb.org/mongo-driver/v2/mongo#GridFSUploadStream
- GridFSDownloadStream:https://pkg.go.dev/go.mongodb.org/mongo-driver/v2/mongo#GridFSDownloadStream
Themocks folder contains the mocks generated bymockeryandgomock tools.
The examples of how to use the mocks can be found in theexamples folder or check any of the*_test.go files aswell.
- Create 4 users, with two admins, using
InsertManyfunction. - Get the admin users only using
Findfunction - Delete all users using
DeleteManyfunction
- users.go is a file with a set of functions, like:
Createto create the users usingInsertManyDeleteto delete the users by given IDsGetAdminsto return the list of admin users
- users_test.go is a file with
TestUsersWorkflowunit tests:mockerytests the workflow usingmockerymocksgomocktests the workflow usinggomockmocksdockertests the workflow using real mongo database run by docker
- Create a collection with random name.
- Check that the collection exists.
- Check that another collection does not exist.
- Drop collection.
- Check that the original collection does not exist.
- collections.go is a file with a set of functions, like:
CreateCollectionto create a collection usingCreateCollectionDropCollectionto delete a collection by given nameCollectionExiststo check that a collection exists
- collections_test.go is a file with
TestCollectionsWorkflowunit tests:mockerytests the workflow usingmockerymocksgomocktests the workflow usinggomockmocksdockertests the workflow using real mongo database run by docker
About
The implementation of the interfaces for the official MongoDB driver in Go
Topics
Resources
License
Code of conduct
Contributing
Security policy
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Uh oh!
There was an error while loading.Please reload this page.
Contributors5
Uh oh!
There was an error while loading.Please reload this page.