Colt
A productive and type-safe MongoDB ODM for Go. Based on the official MongoDB driver but elegant to use.
Install / Use
/learn @jensteichert/ColtREADME
Colt
<a href="https://github.com/jensteichert/colt/releases"><img src="https://img.shields.io/github/v/release/jensteichert/colt" /></a>
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
