当前位置: 首页 > news >正文

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

百度安全验证

相关文章:

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

目录 MongoDB简介 MongoDB的优势 对比mysql的操作 goctl的mongodb代码生成 如何使用 go-zero中mogodb使用 mongodb官方驱动使用 model模型的方式使用 其他资源 MongoDB简介 mongodb是一种高性能、开源、文档型的nosql数据库,被广泛应用于web应用、大数据以…...

服务器新硬盘分区、格式化和挂载

文章目录 参考文献查看了一下起点现状分区(base) ~ sudo parted /dev/sdcmklabel gpt(设置分区类型)增加分区 格式化需要先退出quit(可以)(base) / sudo mkfs.xfs /dev/sdc/sdc1(失败)sudo mkfs.xfs /dev/s…...

Openldap集成Kerberos

文章目录 一、背景二、Openldap集成Kerberos2.1kerberos服务器中绑定Ldap服务器2.1.1创建LDAP管理员用户2.1.2添加principal2.1.3生成keytab文件2.1.4赋予keytab文件权限2.1.5验证keytab文件2.1.6增加KRB5_KTNAME配置 2.2Ldap服务器中绑定kerberos服务器2.2.1生成LDAP数据库Roo…...

(创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据

目录 一、主要内容: 二、运行效果: 三、VMD-BiLSTM负荷预测理论: 四、代码数据下载: 一、主要内容: 本代码结合变分模态分解( Variational Mode Decomposition,VMD) 和卷积神经网络(Convolutional neu…...

机器 reboot 后 kubelet 目录凭空消失的灾难恢复

文章目录 [toc]事故背景报错内容 修复过程停止 kubelet 服务备份 kubelet.config重新生成 kubelet.config重新生成 kubelet 配置文件对比 kubeadm-flags.env 事故背景 因为一些情况,需要 reboot 服务器,结果 reboot 机器后,kubeadm init 节点…...

Pytorch构建vgg16模型

VGG-16 1. 导入工具包 import torch.optim as optim import torch import torch.nn as nn import torch.utils.data import torchvision.transforms as transforms import torchvision.datasets as datasets from torch.utils.data import DataLoader import torch.optim.lr_…...

分支结构相关

1.if 语句 结构: if 条件语句: 代码块 小练习: 使用random.randint()函数随机生成一个1~100之间的整数,判断是否是偶数 import random n random.randint(1,100) print(n) if n % 2 0:print(str(n) "是偶数") 2.else语…...

flutter开发实战-RichText富文本居中对齐

flutter开发实战-RichText富文本居中对齐 在开发过程中,经常会使用到RichText,当使用RichText时候,不同文本字体大小默认没有居中对齐。这里记录一下设置过程。 一、使用RichText 我这里使用RichText设置不同字体大小的文本 Container(de…...

智慧消防新篇章:可视化数据分析平台引领未来

一、什么是智慧消防可视化数据分析平台? 智慧消防可视化数据分析平台,运用大数据、云计算、物联网等先进技术,将消防信息以直观、易懂的图形化方式展示出来。它不仅能够实时监控消防设备的运行状态,还能对火灾风险进行预测和评估…...

u8g2 使用IIC驱动uc1617 lcd有时候某些像素显示不正确

折腾了很久,本来lcd是挂载到已经存在的iic总线上的,总线原来是工作正常的,挂载之后lcd也能显示,但是有时候显示不正确,有时候全白的时候有黑色的杂点。 解决方案: 1.最开始以为是IIC总线速度快&#xff0…...

使用opencv合并两个图像

本节的目的 linear blending(线性混合)使用**addWeighted()**来添加两个图像 原理 (其实我也没太懂,留个坑,感觉本科的时候线代没学好。不对,我本科就没学线代。) 源码分析 源码链接 #include "opencv2/imgc…...

k8s学习笔记(一)

configMap 一般用来存储配置信息 创建configMap 从文件中获取信息创建:kubectl create configmap my-config --from-file/tmp/k8s/user.txt 直接指定信息: kubectl create configmap my-config01 --from-literalkey1config1 --from-literalkey2confi…...

自学前端——JavaScript篇

JavaScript 什么是JavsScript JavaScript是一种轻量级、解释型、面向对象的脚本语言。它主要被设计用于在网页上实现动态效果,增加用户与网页的交互性。 作为一种客户端语言,JavaScript可以直接嵌入HTML,并在浏览器中执行。 与HTML和CSS不…...

高考毕业季--浅谈自己感想

随着2024年高考落幕,数百万高三学生又将面临人生中的重要抉择:选择大学专业。在这个关键节点,计算机相关专业是否仍是“万金油”的选择?在过去很长一段时间里,计算机科学与技术、人工智能、网络安全、软件工程等专业一…...

遥感图像地物覆盖分类,数据集制作-分类模型对比-分类保姆级教程

遥感图像地物覆盖分类,数据集制作-分类模型对比-分类保姆级教程 在遥感影像上人工制作分类数据集采用python+gdal库制作数据集挑选分类模型(RF、KNN、SVM、逻辑回归)选择随机森林模型建模分类遥感图像预测在遥感影像上人工制作分类数据集 1.新建shp文件 地理坐标系保持和影像…...

【Android面试八股文】Kotlin内置标准函数let的原理是什么?

确实,let 函数在 Kotlin 中被广泛使用,特别是在处理可空类型或者需要在对象上执行一系列操作后返回结果的场景中非常有用。 let 函数的源代码 /*** Calls the specified function [block] with `this` value as its argument and returns its result.** For detailed usage i…...

网工面试总结1

网工还是要基本会ACL、ISIS、OSPF、MPLS、QOS、GVRP、VRRP、FW、BGP、STP、IV4\6、WLAN、路由策略、策略路由、LACP等都或多或少要知道,常见的哪怕没有实战,要在ensp、cisco中练过! OSPF邻居故障,你认为是哪些原因?或者…...

[stm32]密码锁

[stm32]密码锁 需要资料的请在文章末尾获取~ ​​ 01描述 使用原件:stm32f103c8t6最小系统板x1,0.96寸OLED显示屏四角x1,4x4矩阵按键x1; 键位对应图: 1, 2, 3, 4------------- 1 2 3 4 5&am…...

优化yarn在任务执行时核数把控不准确的问题

核数不准这个事情是个概率问题,如果你碰见了,只能说你有点非欧,本质上是因为集群配置问题,默认时yarn不会去精准把控任务的核数,因为默认的资源计算方式是用实际内存去估算核数,这就导致如果大家配置任务时…...

2024年,收付通申请开通流程

大家好,今天咱们来聊聊关于APP场景中开通微信收付通的一些实用小窍门。在如今的移动互联网时代,很多商家都选择通过APP来提供服务和产品,因此如何在APP中顺利集成微信收付通功能,让用户能够轻松完成支付,就显得尤为重要…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...