开箱即用的GO后台管理系统 Kratos Admin - 支持MongoDB

开箱即用的GO后台管理系统 Kratos Admin - 支持MongoDB

MongoDB 是一种开源的文档型数据库,属于 NoSQL(非关系型数据库)的范畴,由 MongoDB Inc. 开发并维护。它与传统的关系型数据库(如 MySQL、PostgreSQL)在数据存储结构、查询方式等方面有显著差异,更适合处理非结构化或半结构化数据,以及需要灵活扩展的场景。

MongoDB 的核心概念(与关系型数据库对比)

MongoDB 关系型数据库 说明
数据库(Database) 数据库(Database) 逻辑上的独立数据集合
集合(Collection) 表(Table) 存储文档的容器,无需预定义结构
文档(Document) 行(Row) 一条数据记录,以 BSON 格式存储
字段(Field) 列(Column) 文档中的键值对,类似 JSON 的 "键"
索引(Index) 索引(Index) 用于加速查询,支持单字段、复合、地理等索引
_id字段 主键(Primary Key) 每个文档自动生成的唯一标识,类似主键

Docker部署

下载镜像:

bash 复制代码
docker pull bitnami/mongodb:latest
docker pull bitnami/mongodb-exporter:latest

带密码安装:

bash 复制代码
docker run -itd \
    --name mongodb-server \
    -p 27017:27017 \
    -e MONGODB_ROOT_USER=root \
    -e MONGODB_ROOT_PASSWORD=123456 \
    -e MONGODB_USERNAME=test \
    -e MONGODB_PASSWORD=123456 \
    -e MONGODB_DATABASE=finances \
    bitnami/mongodb:latest

不带密码安装:

bash 复制代码
docker run -itd \
    --name mongodb-server \
    -p 27017:27017 \
    -e ALLOW_EMPTY_PASSWORD=yes \
    bitnami/mongodb:latest

有两点需要注意:

  1. 如果需要映射数据卷,需要把本地路径的所有权改到1001:sudo chown -R 1001:1001 data/db,否则会报错: 'mkdir: cannot create directory '/bitnami/mongodb': Permission denied'
  2. 从MongoDB 5.0开始,有些机器运行会报错:Illegal instruction,这是因为机器硬件不支持 AVX 指令集 的缘故,没办法,MongoDB降级吧。

在 Kratos Admin 中使用 MongoDB

我把MongoDB的SDK封装了起来,并且提供了配置文件的支持,使用起来非常简单。

首先,我们需要安装库:

bash 复制代码
go get github.com/tx7do/kratos-bootstrap/database/mongodb

接着在数据库的配置文件data.yaml中添加MongoDB的配置:

yaml 复制代码
data:
  mongodb:
    uri: "mongodb://root:123456@localhost:27017/?compressors=snappy,zlib,zstd"
    database: finances

现在,我们开始创建客户端,在data.go添加以下代码:

go 复制代码
package data

import (
	"github.com/tx7do/kratos-bootstrap/database/mongodb"
)

func NewMongodbClient(logger log.Logger, cfg *conf.Bootstrap) *mongodb.Client {
	cli, err := mongodb.NewClient(logger, cfg)
	if err != nil {
		return nil
	}
	return cli
}

data/init.go注入到wire:

go 复制代码
//go:build wireinject
// +build wireinject

package data

import "github.com/google/wire"

var ProviderSet = wire.NewSet(
	NewMongodbClient,
)

在这里,我们以股票的K线(蜡烛图)为实例,来讲解如何使用MongoDB。

首先,定义模型:

go 复制代码
package data

import (
	"google.golang.org/protobuf/types/known/timestamppb"
)

type Candle struct {
	Symbol    *string                `json:"s" bson:"s"`
	Open      *float64               `json:"o" bson:"o"`
	High      *float64               `json:"h" bson:"h"`
	Low       *float64               `json:"l" bson:"l"`
	Close     *float64               `json:"c" bson:"c"`
	Volume    *float64               `json:"v" bson:"v"`
	StartTime *timestamppb.Timestamp `json:"st" bson:"st"`
	EndTime   *timestamppb.Timestamp `json:"et" bson:"et"`
}

最后,实现CancleRepo

go 复制代码
package data

import (
   "github.com/go-kratos/kratos/v2/log"
   "github.com/tx7do/kratos-bootstrap/database/mongodb"
)

const (
   // CollectionCandle is the name of the candle collection.
   CollectionCandle = "candles"
)

type CandleRepo struct {
   client *mongodb.Client
   log    *log.Helper
}

func NewCandleRepo(logger log.Logger, client *mongodb.Client) *CandleRepo {
   repo := &CandleRepo{
      client: client,
      log:    log.NewHelper(log.With(logger, "module", "candle/mongo/repo")),
   }

   return repo
}

func (r *CandleRepo) Create(ctx context.Context, req *Candle) error {
   if req == nil {
      return candleV1.ErrorBadRequest("request data is required")
   }

   err := r.client.InsertOne(ctx, CollectionCandle, "", req)
   if err != nil {
      r.log.Errorf("create candle failed: %s", err.Error())
      return candleV1.ErrorInternalServerError("create candle failed")
   }
   return nil
}

项目代码

相关推荐
老马9527几秒前
opencode3-我的能力超乎你的想象
人工智能·后端
weixin_4080996710 分钟前
【企业级方案】财务自动化:OCR发票识别 + 自动录入系统完整实现(附代码与落地架构)
后端·ocr·api·发票 ocr 识别·发票自动录入系统·发票识别 api·财务自动化
千寻简25 分钟前
一个让 Claude Code 顺手很多的状态栏插件:claude-hud
前端·后端
掘金者阿豪27 分钟前
数据库安全第一关:用户密码存储与认证机制的深度拆解
java·前端·后端
MgArcher34 分钟前
Python高级特性:sorted() 排序完全指南
前端·后端
MgArcher34 分钟前
Python高级特性:返回函数与闭包完全指南
前端·后端
未秃头的程序猿34 分钟前
💥 MyBatis 面试连环炮:从源码原理到实战避坑,彻底拿下 Offer 通关秘籍
后端·面试·mybatis
Java编程爱好者34 分钟前
深入浅出 Java volatile:从硬件到 JMM 的完整剖析
后端
程序员cxuan37 分钟前
36 张图彻底解释清楚 AI 圈 136 个造词艺术!!!
人工智能·后端·github copilot