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

下载镜像:

docker pull bitnami/mongodb:latest
docker pull bitnami/mongodb-exporter:latest

带密码安装:

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

不带密码安装:

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封装了起来,并且提供了配置文件的支持,使用起来非常简单。

首先,我们需要安装库:

go get github.com/tx7do/kratos-bootstrap/database/mongodb

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

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

现在,我们开始创建客户端,在data.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:build wireinject
// +build wireinject

package data

import "github.com/google/wire"

var ProviderSet = wire.NewSet(
    NewMongodbClient,
)

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

首先,定义模型:

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

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
}

项目代码

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容