Skip to content

A productive and type-safe MongoDB ODM for Go. Based on the official MongoDB driver but elegant to use.

License

Notifications You must be signed in to change notification settings

jensteichert/colt

Repository files navigation

Colt

Build & Tests Coverage Status Go.Dev reference CodeQL Go Report Card

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