Skip to content
gocrootPublic

Latest commit

 

History

12 Commits

Folders and files

Repository files navigation

MongoDB Helper for Golang

Part of the GoCroot ecosystem. Used by GoCroot Core.

Overview

This package (mgdb) provides a set of helper functions to simplify interaction with MongoDB from a Golang application. It includes connection handling, querying, inserting, updating, deleting documents, and working with distinct and random documents.

Installation

To use this package, install it using:

go get github.com/gocroot/mgdb

Then, include the package in your Go project:

import "github.com/gocroot/mgdb"

Connecting to MongoDB

Example:

mconn := mgdb.DBInfo{
    DBString: "mongodb+srv://username:password@cluster.mongodb.net/mydatabase",
    DBName:   "mydatabase",
}
db, err := mgdb.MongoConnect(mconn)
if err != nil {
    log.Fatal(err)
}

If u want to call inside a config folder

package config

import (
	"os"

	"github.com/gocroot/mgdb"
)

var mconn = mgdb.DBInfo{
	DBString: os.Getenv("MONGOSTRING"),
	DBName:   "mydatabase",
}

var Mongoconn, ErrorMongoconn = mgdb.MongoConnect(mconn)

CRUD Operations

Insert Documents

Insert One Document

doc := bson.M{"name": "John Doe", "age": 30}
id, err := mgdb.InsertOneDoc(db, "users", doc)
if err != nil {
    log.Fatal(err)
}
fmt.Println("Inserted ID:", id)

Insert Multiple Documents

docs := []bson.M{
    {"name": "Alice", "age": 25},
    {"name": "Bob", "age": 28},
}
ids, err := mgdb.InsertManyDocs(db, "users", docs)
if err != nil {
    log.Fatal(err)
}
fmt.Println("Inserted IDs:", ids)

Query Documents

Get One Document

filter := bson.M{"name": "John Doe"}
user, err := mgdb.GetOneDoc[struct {
    Name string `bson:"name"`
    Age  int    `bson:"age"`
}](db, "users", filter)
if err != nil {
    log.Fatal(err)
}
fmt.Println("User:", user)

Get All Documents

filter := bson.M{} // Empty filter to get all documents
users, err := mgdb.GetAllDoc[[]struct{Name string `bson:"name"`; Age int `bson:"age"`}](db, "users", filter)
if err != nil {
    log.Fatal(err)
}
fmt.Println("Users:", users)

Get Distinct Field Values

values, err := mgdb.GetAllDistinct[string](db, bson.M{}, "name", "users")
if err != nil {
    log.Fatal(err)
}
fmt.Println("Distinct Names:", values)

Get Random Documents

randomUsers, err := mgdb.GetRandomDoc[struct{Name string `bson:"name"`; Age int `bson:"age"`}](db, "users", 2)
if err != nil {
    log.Fatal(err)
}
fmt.Println("Random Users:", randomUsers)

Update Documents

Update One Document

filter := bson.M{"name": "John Doe"}
updateFields := bson.M{"age": 31}
_, err := mgdb.UpdateOneDoc(db, "users", filter, updateFields)
if err != nil {
    log.Fatal(err)
}

Replace One Document

newUser := struct {
    Name string `bson:"name"`
    Age  int    `bson:"age"`
    City string `bson:"city"`
}{"John Doe", 32, "New York"}

_, err := mgdb.ReplaceOneDoc(db, "users", filter, newUser)
if err != nil {
    log.Fatal(err)
}

Delete Documents

Delete One Document

_, err := mgdb.DeleteOneDoc(db, "users", filter)
if err != nil {
    log.Fatal(err)
}

Delete Multiple Documents

_, err := mgdb.DeleteManyDocs(db, "users", bson.M{"age": bson.M{"$lt": 30}})
if err != nil {
    log.Fatal(err)
}

Drop Collection

err := mgdb.DropCollection(db, "users")
if err != nil {
    log.Fatal(err)
}

Working with Array Fields

Add Document to Array

type Hobby struct {
    Name string `bson:"name"`
}

newHobby := Hobby{Name: "Cycling"}
_, err := mgdb.AddDocToArray[Hobby](db, "users", userID, "hobbies", newHobby)
if err != nil {
    log.Fatal(err)
}

Remove Document from Array

hobbyToRemove := Hobby{Name: "Cycling"}
_, err := mgdb.DeleteDocFromArray[Hobby](db, "users", userID, "hobbies", hobbyToRemove)
if err != nil {
    log.Fatal(err)
}

Edit Document in Array

filterCondition := bson.M{"name": "Cycling"}
updatedFields := bson.M{"name": "Mountain Biking"}
_, err := mgdb.EditDocInArray(db, "users", userID, "hobbies", filterCondition, updatedFields)
if err != nil {
    log.Fatal(err)
}

Date and Time Utilities

Get Yesterday Start and End Time

startDay, endDay := mgdb.GetYesterdayStartEnd()

Get Current Date

dateNow := mgdb.GetDateSekarang()

Filters for Dates

todayFilter := mgdb.TodayFilter()
yesterdayFilter := mgdb.YesterdayFilter()
yesterdayNotHolidayFilter := mgdb.YesterdayNotLiburFilter()

Get Yesterday's Date (Excluding Holidays)

yesterdayNonHoliday := mgdb.GetDateKemarinBukanHariLibur()

Check if a Date is a Holiday

isHoliday := mgdb.HariLibur(time.Now())

License

This package is open-source and available for use under the MIT License.

Keamanan & Performa

  • Timeout: setiap operasi database dibatasi mgdb.OperationTimeout (default 30 detik), termasuk koneksi awal. Ubah sebelum dipakai jika perlu, misalnya mgdb.OperationTimeout = 10 * time.Second.
  • Tidak panic: MongoConnect mengembalikan error untuk URI kosong atau rusak. Untuk fallback SRV, gunakan mgdb.LookupSRV(uri) yang mengembalikan error. SRVLookup lama tetap ada (deprecated) dan mengembalikan string kosong jika gagal.
  • Upsert: UpdateOneDoc membuat dokumen baru jika filter tidak cocok.
  • NoSQL injection: jangan memasukkan map/bson.M hasil decode JSON dari request langsung ke filter, karena input seperti {"$ne": null} bisa mengubah arti query. Decode ke struct dengan field bertipe jelas (misalnya string), lalu susun filter sendiri. EditDocInArray menolak nama field yang diawali $.
  • Hari libur: HariLibur tidak memanggil API untuk Sabtu/Minggu, dan menyimpan daftar libur per bulan di cache selama 12 jam. Endpoint bisa diganti lewat mgdb.HolidayAPIURL, client HTTP lewat mgdb.HTTPClient (timeout 15 detik).

Release Version

Rilis dibuat otomatis oleh workflow Auto Tag & Release setiap ada push ke main yang mengubah kode Go, go.mod, atau go.sum. Jangan membuat tag manual. Kenaikan versi mengikuti pesan commit: fix: → patch, feat: → minor, dan [skip release] untuk melewati rilis. Rilis manual bisa lewat tab Actions → Run workflow.

go get -u ./...
go mod tidy
go list -m -versions github.com/gocroot/mgdb

Releases

Packages

Used by

Contributors

Languages