开箱即用的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
}

项目代码

相关推荐
Java编程爱好者几秒前
是猫踩键盘还是乱码?不,这是你刚写的正则表达式
后端
源代码•宸2 分钟前
分布式缓存-GO(简历写法、常见面试题)
服务器·开发语言·经验分享·分布式·后端·缓存·golang
嘻哈baby7 分钟前
Nacos服务注册与配置中心实战指南
微服务
LaughingDangZi16 分钟前
vue+java分离项目实现微信公众号开发全流程梳理
java·前端·后端
神奇小汤圆19 分钟前
RabbitMQ发布订阅模式同一消费者多个实例如何防止重复消费?
后端
leeggco25 分钟前
Batfish Dashboard 项目说明文档
后端
qq_12498707531 小时前
基于springboot健康养老APP的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·mysql·微信小程序·毕业设计
盒马盒马1 小时前
Rust:内部可变性 & 型变
开发语言·后端·rust
2501_924064111 小时前
2025年优测全链路压测平台:高并发卡顿环节精准定位实践
微服务·压测方案