go-zero使用goctl生成mongodb的操作使用方法

目录

MongoDB简介

MongoDB的优势

对比mysql的操作

goctl的mongodb代码生成

如何使用

go-zero中mogodb使用

mongodb官方驱动使用

model模型的方式使用

其他资源


MongoDB简介

mongodb是一种高性能、开源、文档型的nosql数据库,被广泛应用于web应用、大数据以及云计算领域。

在使用MongoDB之前,需要先在您的系统中安装MongoDB。在Linux系统下,可以通过如下命令安装:

sudo apt-get install mongodb

MongoDB的优势

1. 强大的灵活性

MongoDB是一个面向文档的数据库,它使用BSON(二进制JSON)格式来存储数据。相比之下,MySQL是一个关系型数据库,使用表格来存储数据。这使得MongoDB更加灵活,可以存储不同结构的文档。例如,我们可以在同一个集合中存储不同类型的文档,而MySQL需要创建多个表来存储不同类型的数据。

2. 高性能的读写操作

由于MongoDB使用BSON格式存储数据,并且数据存储在文档中,它可以更快地读写数据。此外,MongoDB还支持内置的复制和分片机制,可用于处理高并发的读写操作。相比之下,MySQL需要通过SQL查询语句来读写数据,这通常比MongoDB的操作要慢一些。

3. 分布式扩展性

MongoDB可以轻松地进行水平扩展,即通过添加更多的节点来增加存储容量和处理能力。这种分布式架构使得MongoDB能够处理大量数据和高并发请求。与之相比,MySQL在处理大规模数据和高并发情况下的扩展性有限。

4. 灵活的数据模型

MongoDB的数据模型允许我们使用嵌套文档和数组来表示复杂的数据结构。这使得数据的存储和查询更加方便,无需进行多个表之间的连接操作。例如,我们可以在一个文档中存储一个订单及其相关的所有产品,并且可以轻松地查询和更新这个文档。相比之下,MySQL需要通过多个表和连接操作来实现类似的功能。

对比mysql的操作

在数据库的操作上与mysql有很大不同。毕竟一个是非关系型,一个是关系型数据库。接下来从python代码上先来直观感受下二者的不同。

python操作mogodb示例

# MongoDB示例# 连接到MongoDB数据库
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')# 获取数据库和集合对象
db = client['mydb']
collection = db['mycollection']# 插入一条文档
data = {'name': 'John', 'age': 25}
collection.insert_one(data)# 查询文档
result = collection.find_one({'name': 'John'})
print(result)# 关闭连接
client.close()

mysql的python 示例

-- MySQL示例-- 连接到MySQL数据库
import mysql.connector
cnx = mysql.connector.connect(user='root', password='password', host='localhost', database='mydb')-- 获取游标
cursor = cnx.cursor()-- 插入一条记录
sql = "INSERT INTO mytable (name, age) VALUES (%s, %s)"
values = ('John', 25)
cursor.execute(sql, values)
cnx.commit()-- 查询记录
sql = "SELECT * FROM mytable WHERE name = 'John'"
cursor.execute(sql)
result = cursor.fetchone()
print(result)-- 关闭连接
cursor.close()
cnx.close()

通过以上示例,可以看到MongoDB使用了面向文档的操作方式,数据以JSON格式存储在集合中,并且不需要事先定义表结构。而MySQL需要使用SQL语句来进行数据的插入和查询,需要提前定义表结构。

总的来说,MongoDB在灵活性、高性能读写、分布式扩展性和灵活的数据模型方面相对于MySQL有许多优势。当处理需要存储和查询复杂数据结构、大规模数据和高并发请求时,MongoDB是一个更好的选择。

goctl的mongodb代码生成

goctl model 为 goctl 提供的数据库模型代码生成指令,目前支持 MySQL、PostgreSQL、Mongo 的代码生成,MySQL 支持从 sql 文件和数据库连接两种方式生成,PostgreSQL 仅支持从数据库连接生成。

goctl model 为go-zero下的工具模块中的组件之一,目前支持MongoDB进行model层代码生成。官网有对MySQL的使用方法,但是没有对MongoDB的使用进行讲解,那么我下面介绍goctl model对MongoDB的使用方法。

Mongo 模型层代码的生成不同于 MySQL,MySQL 可以从 scheme_information 库中读取到一张表的信息(字段名称,数据类型,索引等), 而 Mongo 是文档型数据库,我们暂时无法从 db 中读取某一条记录来实现字段信息获取。

Usage:                                                                           goctl model mongo [flags]                                                      Flags:                                                                           --branch string   The branch of the remote repo, it does work with --remote-c, --cache           Generate code with cache [optional]                      -d, --dir string      The target dir-e, --easy            Generate code with auto generated CollectionName for easy declare [optional]-h, --help            help for mongo--home string     The goctl home path of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority--remote string   The remote git repo of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priorityThe git repo directory must be consistent with the https://github.com/zeromicro/go-zero-template directory structure--style string    The file naming format, see [https://github.com/zeromicro/go-zero/tree/master/tools/goctl/config/readme.md]-t, --type strings    Specified model type name

各个参数的含义,主要用的是 -e -dir -t
-e表示的是生成一个简单的增删改查接口,-dir是生成文档放在的目录
-t是生成文件的前缀名称
-c是带缓存的 

如何使用

goctl model mongo -t User -dir model/user

如何生成model层代码?执行以上命令即可,很简单,不需要提前编写什么模型文件,以上命令将自动在model/user目录下生成模型框架代码,如果需要扩展其他字段类型,直接修改生成的usertypes.go文件。

过程如下:

# enter user home
$ cd ~# make dir named demo 
$ mkdir demo && cd demo# generate mongo code by goctl
$ goctl model mongo --type User --dir cache --cache# view layout
$ tree
.
└── cache├── error.go├── usermodel.go├── usermodelgen.go└── usertypes.go1 directory, 4 files

go-zero中mogodb使用

go-zero中mogodb的基础使用:

package mainimport ("context""time""github.com/globalsign/mgo/bson""github.com/zeromicro/go-zero/core/stores/mon""go.mongodb.org/mongo-driver/bson/primitive"
)type Roster struct {Id          primitive.ObjectID `bson:"_id"`CreateTime  time.Time          `bson:"createTime"`DisplayName string             `bson:"displayName"`
}func main() {model := mon.MustNewModel("mongodb://root:example@127.0.0.1:27017", "db", "user")r := &Roster{Id:          primitive.NewObjectID(),CreateTime:  time.Now(),DisplayName: "Hello",}ctx := context.Background()_, err := model.InsertOne(ctx, r)if err != nil {panic(err)}update := bson.M{"$set": bson.M{"displayName": "Hello world","createTime":  time.Now(),}}_, err = model.UpdateByID(ctx, r.Id, update)if err != nil {panic(err)}r.DisplayName = "Hello world!"_, err = model.ReplaceOne(ctx, bson.M{"_id": r.Id}, r)if err != nil {panic(err)}var tr Rostererr = model.FindOne(ctx, &tr, bson.M{"_id": r.Id})if err != nil {panic(err)}
}

mongodb官方驱动使用

再来看下在在golang中的mongodb官方驱动使用示例:

package mainimport ("context""log""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)func main() {clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")client, err := mongo.Connect(context.Background(), clientOptions)if err != nil {log.Fatal(err)}defer client.Disconnect(context.Background())coll := client.Database("your_db_name").Collection("user")// 插入数据doc := &user.User{Id:    "1",Name:  "Alice",Email: "alice@example.com",}_, err = coll.InsertOne(context.TODO(), doc)if err != nil {log.Fatal(err)}// 查询数据var result user.Usererr = coll.FindOne(context.TODO(), bson.M{"_id": "1"}).Decode(&result)if err != nil {log.Fatal(err)}log.Printf("Found user: %+v", result)// 更新数据updateResult, err := coll.UpdateOne(context.TODO(),bson.M{"_id": "1"},bson.D{{"$set", bson.D{{"email", "alice.updated@example.com"}}}},)if err != nil {log.Fatal(err)}log.Printf("Modified count: %v", updateResult.ModifiedCount)// 删除数据deleteResult, err := coll.DeleteOne(context.TODO(), bson.M{"_id": "1"})if err != nil {log.Fatal(err)}log.Printf("Deleted count: %v", deleteResult.DeletedCount)
}

model模型的方式使用

具体的实例化方法,参照goctl模型层的使用,在internal/svc/servicecontext.go 中完成模型的连接和实例化。比较简单,具体根据需要更改。

package svcimport "myprj/internal/config"//手动代码
import "myprj/rpc/model"type ServiceContext struct {Config config.ConfigModel  model.NewUserModel// 手动代码
}func NewServiceContext(c config.Config) *ServiceContext {return &ServiceContext{Config: c,Model:  model.NewUserModel(c.DataSource, c.Cache), // 手动代码}
}

其他资源

[zeromicro/go-zero]关于mongo生成model方案讨论 - ABSoft

Release Release v1.1.6 · zeromicro/go-zero · GitHub

MongoDB统一数据查询钩子_go-zero mongodb-CSDN博客

使用goctl model 生成MongoDB操作模板_go生成mongodb定义-CSDN博客

go-zero mongo 创建事务_go-zero mongodb-CSDN博客

Go操作mongodb数据库方法示例_Golang_脚本之家

如何将 Go 与 MongoDB 结合使用?-mysql教程-PHP中文网

MongoDB Go Driver - Go Driver v1.15

goctl model | go-zero Documentation

基本 CURD | go-zero Documentation

https://blog.51cto.com/u_16175516/6811965

百度安全验证

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/31178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刷题——寻找峰值

寻找峰值_牛客题霸_牛客网 int findPeakElement(vector<int>& nums) {// write code hereint left 0, right nums.size() - 1;while(left < right){int mid (right - left) / 2 left;if(nums[mid] < nums[mid 1])left mid 1;elseright mid;}return lef…

Linux grep -r 遍历包括子文件内容和 jar包的类

grep -r 遍历包括子文件内容和 jar包的类 (base) [roottest002 24-06-20 13:38:47 flink-cdc-3.1.0 #] grep -r com.mysql.cj.jdbc.Driver * 匹配到二进制文件 lib/mysql-connector-java-8.0.27.jar (base) [roottest002 24-06-20 13:41:32 flink-cdc-3.1.0 #] vim 1 (base) [r…

性能测试-性能监控分析与调优(三)《实战》

性能监控 使用命令监控 cpu瓶颈分析 top命令 在进行性能测试时使用top命令&#xff0c;界面如下 上图可以看出 CPU 概况区&#xff1a; %Cpu(s): us&#xff08;用户进程占用CPU的百分比&#xff09;, 和 sy&#xff08;系统进程占用CPU的百分比&#xff09; 的数值很高…

FreeRTOS学习 -- 队列

一、队列简介 队列是为了任务与任务、任务与中断之间的通信而准备的&#xff0c;可以在任务与任务、任务与中断之间传递消息&#xff0c;队列中可以存储有限的、大小固定的数据项目。 任务与任务、任务与中断之间要交流的数据保存在队列中&#xff0c;叫做队列项目。 队列所能…

Python学习笔记14 -- 异常处理

try -- except 1、使用原因&#xff1a; 当用户输入不符合预期的命令时&#xff0c;尽量避免程序报错&#xff0c;并给出正常指令使用户能调整指令 try:guess_limit int(sys.argv[1]) except:guess_limit 4 # 默认为4次print("The input of chance has something wr…

代码随想录-Day36

452. 用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂…

建筑工程乙级资质审批的关键要点

企业条件&#xff1a;审批时会严格审查企业的基本情况&#xff0c;如注册资本、经营年限、法人代表及管理层的背景等&#xff0c;确保企业合法存续且信誉良好。 技术人员配置&#xff1a;这是审批的重点之一&#xff0c;需要审查技术人员的专业资格、职称、工作经验以及在岗情…

Linux--视频推流及问题

方案一&#xff1a; mjpg-streamer,它运行在ARM板上 在手机上使用浏览器直接观看视频 方案二&#xff1a; 推流端&#xff08;Fmpeg&#xff09;--rtmp-->Nginx&#xff08;流媒体服务器&#xff09;--rtmp/httpflv/hls-->浏览器、播放器 此篇文章记录方案二的具体细…

MixChecker ULTRA - 您的混音是否真正完美 ?

https://www.bilibili.com/video/BV1fn4y1Q7jo/?vd_source106698354c99ab1e247cf1ba622daa0b MixChecker ULTRA - 您的混音是否真正完美 &#xff1f; 无论您是专业的混音/母带工程师&#xff0c;还是在家中为粉丝或乐队混音音乐&#xff0c;我们都努力实现一个共同的目标&a…

Meta悄咪咪的发布多款AI新模型

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则…

自定义线程池

自定义线程池需要什么 需要哪些类 MyTask /*** 自定义线程池任务* 要求每个线程有自己的编号* 线程的执行时间为0.2s*/ Data public class MyTask implements Runnable{private int id;MyTask(int id) {this.id id;}Overridepublic void run() {String name Thread.curren…

基于Java的家政服务管理平台

开头语&#xff1a;你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;B/S结构&#xff0c;SpringBoot框架 工具&#xff1a;MyEclipse&#xff0c;Nav…

网络编程5----初识http

1.1 请求和响应的格式 http协议和前边学过的传输层、网络层协议不同&#xff0c;它是“一问一答”形式的&#xff0c;所以要分为请求和响应两部分看待&#xff0c;同时&#xff0c;请求和响应的格式是不同的&#xff0c;我们来具体介绍一下。 1.1.1 请求 在介绍请求之前&…

Github生成Personal access tokens及在git中使用

目录 生成Token 使用Token-手工修改 使用Token-自动 生成Token 登录GitHub&#xff0c;在GitHub右上角点击个人资料头像&#xff0c;点击Settings → Developer Settings → Personal access tokens (classic)。 在界面上选择点击【Generate new token】&#xff0c;填写如…

Java 笔记:常见正则使用

文章目录 Java 笔记&#xff1a;常见正则使用正则简介常用匹配年月日的时间匹配手机号码校验 参考文章 Java 笔记&#xff1a;常见正则使用 正则简介 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言&#xff0c;但…

绝对全网首发,利用Disruptor EventHandler实现在多线程下顺序执行任务

disruptor有两种任务处理器&#xff0c;一个是EventHandler ,另一个是WorkHandler. EventHandler可以彼此独立消费同一个队列中的任务&#xff0c;WorkHandler可以共同竞争消费同一个队列中的任务。也就是说&#xff0c;假设任务队列中有a、b、c、d三个事件&#xff0c;eventHa…

手机携号转网接口查询与对接指南:技术开发者必备手册

在当今通信技术飞速发展的背景下&#xff0c;手机携号转网已成为推动电信市场竞争、保障用户权益的重要手段。而对于技术开发者而言&#xff0c;掌握手机携号转网接口的查询与对接方法&#xff0c;无疑是提升服务兼容性和用户满意度的关键。 比如如下应用场景&#xff1a; 1.…

算法训练营day65-岛屿连同问题

深搜-岛屿&#xff1a;99. 岛屿数量 (kamacoder.com) // 深度搜索 dfs #include<bits/stdc.h>using namespace std;int dir[4][2] {0, 1, 1, 0, -1, 0, 0, -1};void dfs(vector<vector<int>>& map, vector<vector<bool>>& findednode,…

常用加密算法之 SM4 简介及应用

一、SM4 简介 SM4 是中国国家密码管理局提出的一种分组密码算法&#xff0c;也称为 SMS4。它属于对称加密算法&#xff0c;分组长度为 128 比特&#xff0c;密钥长度也为 128 比特。SM4 算法采用了与 AES 类似的轮函数结构&#xff0c;但具体的 S 盒和线性变换与 AES 不同&…

项目八 OpenStack存储管理

任务一 理解OpenStack块存储服务 1.1 •Cinder的主要功能 • 提供 持久性块存储资源&#xff0c;供 Nova 计算服务的虚拟机实例使用 。 • 为 管理块存储设备提供一套方法&#xff0c;对卷实现从创建到删除的整个生命周期 管理。 • 将 不同的后端存储进行封装&#xff0c;对外…