Socket
Socket
Sign inDemoInstall

github.com/Lyearn/mgod

Package Overview
Dependencies
20
Alerts
File Explorer

Install Socket

Detect and block malicious and high-risk dependencies

Install

    github.com/Lyearn/mgod

Package mgod implements ODM logic for MongoDB in Go.


Version published

Readme

Source

logo

mgod

mgod is a MongoDB ODM specifically designed for Go. It provides a structured way to map Go models to MongoDB collections, simplifying database interactions in Go applications.

  • Features
  • Requirements
  • Installation
  • Basic Usage
  • Motivation
  • Future Scope
  • Documentation
  • Contribute
  • License

Features

  • Reuse existing Go structs to define models and perform Mongo operations.
  • Automatic field transformation between Go and MongoDB using struct tags.
  • Easily manage meta fields in models without cluttering Go structs.
  • Supports union types, expanding data capabilities.
  • Implement strict field requirements with struct tags for data integrity.
  • Wrapper around the official Mongo Go Driver.

Requirements

  • Go 1.18 or higher.
  • MongoDB 3.6 and higher.

Installation

go get github.com/Lyearn/mgod

Basic Usage

Use existing MongoDB connection, or setup a new one to register a default database connection.

For existing database connection,

import "github.com/Lyearn/mgod"

func init() {
	// dbConn is the database connection obtained using Go Mongo Driver's Connect method.
	mgod.SetDefaultConnection(dbConn)
}

To setup a new connection,

import (
	"time"

	"github.com/Lyearn/mgod"
	"go.mongodb.org/mongo-driver/mongo/options"
)

func init() {
	// `cfg` is optional. Can rely on default configurations by providing `nil` value in argument.
	cfg := &mgod.ConnectionConfig{Timeout: 5 * time.Second}
	dbName := "mgod-test"
	opts := options.Client().ApplyURI("mongodb://root:mgod123@localhost:27017")

	err := mgod.ConfigureDefaultConnection(cfg, dbName, opts)
}

Add tags (wherever applicable) in existing struct (or define a new model).

type User struct {
	Name     string
	EmailID  string `bson:"emailId"`
	Age      *int32 `bson:",omitempty"`
	JoinedOn string `bson:"joinedOn" mgoType:"date"`
}

Use mgod to get the entity ODM.

import (
	"github.com/Lyearn/mgod"
	"github.com/Lyearn/mgod/schema/schemaopt"
)

model := User{}
schemaOpts := schemaopt.SchemaOptions{
	Collection: "users",
	Timestamps: true,
}

userModel, _ := mgod.NewEntityMongoModel(model, schemaOpts)

Use the entity ODM to perform CRUD operations with ease.

Insert a new document.

joinedOn, _ := dateformatter.New(time.Now()).GetISOString()
userDoc := User{
	Name: "Gopher",
	EmailID: "gopher@mgod.com",
	JoinedOn: joinedOn,
}
user, _ := userModel.InsertOne(context.TODO(), userDoc)

Output:

{
	"_id": ObjectId("65697705d4cbed00e8aba717"),
	"name": "Gopher",
	"emailId": "gopher@mgod.com",
	"joinedOn": ISODate("2023-12-01T11:32:19.290Z"),
	"createdAt": ISODate("2023-12-01T11:32:19.290Z"),
	"updatedAt": ISODate("2023-12-01T11:32:19.290Z"),
	"__v": 0
}

Find documents using model properties.

users, _ := userModel.Find(context.TODO(), bson.M{"name": userDoc.Name})

Output:

[]User{
	User{
		Name: "Gopher",
		EmailID: "gopher@mgod.com",
		JoinedOn: "2023-12-01T11:32:19.290Z",
	}
}

Motivation

Creating mgod was driven by the need to simplify MongoDB interactions while keeping one schema for all in Go. Traditionally, working with MongoDB in Go involved either using separate structs for database and service logic or manually converting service structs to MongoDB documents, a process that was both time-consuming and error-prone. This lack of integration often led to redundant coding, especially when dealing with union types or adding meta fields for each MongoDB operation.

Inspired by the easy interface of MongoDB handling using Mongoose and Typegoose libraries available in Node, mgod aims to streamline these processes. It offers a more integrated approach, reducing the need to duplicate code and enhancing type safety, making MongoDB operations more intuitive and efficient in Go.

Future Scope

The current version of mgod is a stable release. However, there are plans to add a lot more features like -

  • Enable functionality to opt out of the default conversion of date fields to ISOString format.
  • Implement a setup step for storing a default Mongo connection, eliminating the need to pass it during EntityMongoModel creation.
  • Provide support for transactions following the integration of default Mongo connection logic.
  • Develop easy to use wrapper functions around MongoDB Aggregation operation.
  • Introduce automatic MongoDB collection selection based on Go struct names as a default behavior.
  • Add test cases to improve code coverage.

If you have any interesting feature requests, feel free to open an issue on GitHub issue tracker. We will be more than happy to discuss that!

Documentation

For user facing documentation, check out docs.

Contribute

For contribution guidelines, check out CONTRIBUTING.

License

mgod is licensed under the MIT License.

FAQs

Last updated on 18 Dec 2023

Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc