Colt
The MongoDB ODM for Go i've always wanted. Inspired by Mongoose.
Colt wraps the official mongo-go-driver.
Requirements
- Go 1.18 or higher. Colt leverages Generics to provide type-safe methods and decoding of documents.
Installation
To install Colt, use go get:
go get github.com/jensteichert/colt
Quick Start
package main import ( "fmt" "github.com/jensteichert/colt" "go.mongodb.org/mongo-driver/bson" ) type Database struct { Todos *colt.Collection[*Todo] } type Todo struct { colt.DocWithTimestamps `bson:",inline"` Title string `bson:"title" json:"title"` } func main() { db := colt.Database{} db.Connect("mongodb://...", "myDatabaseName") database := Database{ Todos: colt.GetCollection[*Todo](&db, "todos"), } newTodo := Todo{Title: "Hello"} todo, _ := database.Todos.Insert(&newTodo) // Will return a Todo insertedTodo, _ := database.Todos.FindById(todo.ID) allTodos, _ := database.Todos.Find(bson.M{"title": "Hello"}) }
Features
Hooks
BeforeInsert Hook
Triggers before a document will be inserted
type Todo struct { colt.DocWithTimestamps `bson:",inline"` } func(t *Todo) BeforeInsert() error { t.DocWithTimestamps.BeforeInsert() // Do something with t here return nil }
BeforeUpdate Hook
Triggers before a document will be updated
func(t *Todo) BeforeUpdate() error { t.DocWithTimestamps.BeforeUpdate() // Do something with t here return nil }
NewID Hook
Can be used to generate custom ids for documents within a collection
func (t *Todo) NewID() string { return "td_" + primitive.NewObjectID().Hex() }
ToDo
- CRUD
- Hooks
- Disconnect
- Context
- Transactions