colt
colt copied to clipboard
A productive and type-safe MongoDB ODM for Go. Based on the official MongoDB driver but elegant to use.
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
- [x] CRUD
- [x] Hooks
- [x] Disconnect
- [ ] Context
- [ ] Transactions