Go实现mongodb增删改查的工具类

文章目录

    • 1、驱动下载
    • 2、实现代码
      • 2.1 Mongodb工具类代码
      • 2.2 使用例子
      • 2.3 运行效果

1、驱动下载

mongodb官方go介绍
使用例子https://www.mongodb.com/docs/drivers/go/current/fundamentals/connection/#connection-example
快速入门https://www.mongodb.com/docs/drivers/go/current/quick-start/

要对mongodb进行增删改查,需要添加对应的go驱动依赖,安装命令

go get go.mongodb.org/mongo-driver/mongo

2、实现代码

2.1 Mongodb工具类代码

封装的工具类mongodao.go

package daoimport ("context""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options""log""time"
)type MondoDao struct {client     *mongo.Clientdb         *mongo.Databasecollection *mongo.Collection
}func (dao *MondoDao) Connect(url string, db string, collection string) {var err errordao.client, err = mongo.Connect(context.TODO(), options.Client().SetConnectTimeout(time.Second*10).ApplyURI(url))if err != nil {log.Fatal(err)}dao.db = dao.client.Database(db)dao.collection = dao.db.Collection(collection)
}// 插入一行
func (dao *MondoDao) InsertOne(obj any) (interface{}, error) {result, err := dao.collection.InsertOne(context.TODO(), obj)if err == nil {return result.InsertedID, err}return nil, err
}// 插入多行
func (dao *MondoDao) InsertMany(objs []any) ([]interface{}, error) {result, err := dao.collection.InsertMany(context.TODO(), objs)if err != nil {return nil, err}return result.InsertedIDs, nil
}// 查询一行
func (dao *MondoDao) FindOne(filter bson.M, obj any) error {result := dao.collection.FindOne(context.TODO(), filter)if result.Err() == nil {err := result.Decode(obj)return err}return result.Err()
}// 查询多行
func (dao *MondoDao) FindMany(filter bson.M, obj any) error {cursor, err := dao.collection.Find(context.TODO(), filter)defer cursor.Close(context.TODO())if err == nil {err = cursor.All(context.TODO(), obj)}return err
}// 分布查询多行
func (dao *MondoDao) FindManyByPage(filter bson.M, obj any, page int64, pagesize int64, sort bson.M) error {options := options.Find().SetSkip((page - 1) * pagesize).SetLimit(pagesize).SetSort(sort)cursor, err := dao.collection.Find(context.TODO(), filter, options)defer cursor.Close(context.TODO())if err == nil {err = cursor.All(context.TODO(), obj)}return err
}// 删除一行
func (dao *MondoDao) DeleteOne(filter bson.M) (int64, error) {result, err := dao.collection.DeleteOne(context.TODO(), filter)if err == nil {return result.DeletedCount, err}return 0, err
}// 删除多行
func (dao *MondoDao) DeleteMany(filter bson.M) (int64, error) {result, err := dao.collection.DeleteMany(context.TODO(), filter)if err == nil {return result.DeletedCount, err}return 0, err
}// 删除集合
func (dao *MondoDao) DropCollection() error {err := dao.collection.Drop(context.TODO())//if err = nil {//	log.Fatal("drop collection %v", err)//}return err
}// 更新一行
func (dao *MondoDao) UpdateOne(filter bson.M, update bson.M) (int64, error) {result, err := dao.collection.UpdateOne(context.TODO(), filter, update)if err == nil {return result.ModifiedCount, err}return 0, err
}// 更新多行
func (dao *MondoDao) UpdateMany(filter bson.M, update bson.M) (int64, error) {result, err := dao.collection.UpdateMany(context.TODO(), filter, update)if err == nil {return result.ModifiedCount, err}return 0, err
}/**
// 条件查询
$lt  	小于 				bson.M{"age": bson.M{"$lt": 20}}
$gt 	 大于 				bson.M{"age": bson.M{"$gt": 20}}
$lte 	小于等于 			bson.M{"age": bson.M{"$lte": 20}} bson.D{{"age", bson.D{{"$lte", 20}}}}
$gte 	大于等于 			bson.M{"age": bson.M{"$gte": 20}}
$ne 	不等于 				bson.M{"age": bson.M{"$ne": 20}}
$eq 	等于,可以省略这个符号 	bson.M{"age": bson.M{"$eq": 20}},bson.M{"age": 20}
$in 	在范围内 			bson.M{"age": bson.M{"$in": []int{16, 33}}}
$nin 	不在范围内 			bson.M{"age": bson.M{"$nin": []int{16, 33}}}
//
$inc 	对给定数值字段数加减 bson.M{"$inc": bson.M{"age": -5}}
$set 	设置字段值,如果字段不存在则创建 bson.M{"$set": bson.M{"age": 100}}
$unset 移除字段 {'$unset':{'Name':""}}
*/

2.2 使用例子

使用例子

package mainimport ("fmt""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/bson/primitive""log""mymongodb/dao"
)type User struct {ID   primitive.ObjectID `bson:"_id,omitempty"`Name stringAge  int
}func (s User) String() string {return fmt.Sprintf("%v %v %v", s.ID.Hex(), s.Name, s.Age)
}
func main() {dao := dao.MondoDao{}url := "mongodb://127.0.0.1:27017"dao.Connect(url, "gotest", "user")user1 := User{Name: "user1", Age: 66}id, _ := dao.InsertOne(user1)fmt.Printf("InsertOne id:%v\n", (id.(primitive.ObjectID)).Hex())user2 := []any{User{Name: "user2", Age: 66},User{Name: "user3_3", Age: 76},User{Name: "user3_4", Age: 88},}ids, _ := dao.InsertMany(user2)for index, id := range ids {fmt.Printf("InsertMany id:%v=%v\n", index, (id.(primitive.ObjectID)).Hex())}filter3 := bson.M{"name": "user2", "age": 66}var user3 Usererr := dao.FindOne(filter3, &user3)fmt.Printf("Findone user3:%v, %v\n", user3, err)var user4 []Userfilter4 := bson.M{"age": bson.M{"$gt": 60}}err4 := dao.FindMany(filter4, &user4)if err4 == nil {for index, v := range user4 {fmt.Printf("FindMany user4:%v, %v, \n", index, v)}}var users5 []Userfilter5 := bson.M{"age": bson.M{"$gt": 65}}sort := bson.M{"age": 1}err5 := dao.FindManyByPage(filter5, &users5, 1, 10, sort)if err5 == nil {for index, v := range users5 {fmt.Printf("FindManyByPage user5:%v, %v\n", index, v.String())}}filter8 := bson.M{"name": "user2"}update8 := bson.M{"$inc": bson.M{"age": +6}}count8, err8 := dao.UpdateOne(filter8, update8)fmt.Printf("UpdateOne count:%v, %v\n", count8, err8)filter9 := bson.M{"$or": []bson.M{bson.M{"name": "user1"}, bson.M{"name": "user2"}}}update9 := bson.M{"$set": bson.M{"age": 90}}count9, err9 := dao.UpdateMany(filter9, update9)fmt.Printf("UpdateMany count:%v, %v\n", count9, err9)filter6 := bson.M{"name": "user1", "age": 90}deletecount6, err6 := dao.DeleteOne(filter6)fmt.Printf("DeleteOne count:%v, %v\n", deletecount6, err6)filter7 := bson.M{"age": bson.M{"$gte": 66}}deletecount7, err7 := dao.DeleteMany(filter7)fmt.Printf("DeleteMany count:%v, %v\n", deletecount7, err7)err10 := dao.DropCollection()if err10 == nil {fmt.Println("drop Collection success!")} else {log.Fatal("drop collection error,%v", err)}
}

2.3 运行效果

D:\project\go\gotest\sql\mongodb>go run main.go
InsertOne id:64d32053a61a1841b70e129a
InsertMany id:0=64d32054a61a1841b70e129b
InsertMany id:1=64d32054a61a1841b70e129c
InsertMany id:2=64d32054a61a1841b70e129d
Findone user3:64d32054a61a1841b70e129b user2 66, <nil>
FindMany user4:0, 64d32053a61a1841b70e129a user1 66, 
FindMany user4:1, 64d32054a61a1841b70e129b user2 66, 
FindMany user4:2, 64d32054a61a1841b70e129c user3_3 76, 
FindMany user4:3, 64d32054a61a1841b70e129d user3_4 88, 
FindManyByPage user5:0, 64d32053a61a1841b70e129a user1 66
FindManyByPage user5:1, 64d32054a61a1841b70e129b user2 66
FindManyByPage user5:2, 64d32054a61a1841b70e129c user3_3 76
FindManyByPage user5:3, 64d32054a61a1841b70e129d user3_4 88
UpdateOne count:1, <nil>
UpdateMany count:2, <nil>
DeleteOne count:1, <nil>
DeleteMany count:3, <nil>
drop Collection success!

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

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

相关文章

git和github学习

一、什么是git和github? 二、学会使用github desktop应用程序 初始使用&#xff1a; 一开始我们是新账户&#xff0c;里面是没有仓库的&#xff0c;需要手动创建一个仓库。此时&#xff0c;这个仓库是创建在本地仓库里面&#xff0c;需要用到push命令&#xff08;就是那个pub…

Vantage透明屏的工作原理是什么?应用、展示、显示

Vantage透明屏是一种新型的显示技术&#xff0c;它能够将图像和视频直接投影到透明的屏幕上&#xff0c;使得观众可以同时看到屏幕上的内容和背后的实物。 这种技术在广告、展览、零售和娱乐等领域有着广泛的应用前景。 Vantage透明屏的工作原理是利用透明的显示面板和背后的…

第21题-巨大的数:给你n个数 ai,求这n个数相乘之后的积的个位数字是多少,0 < n,ai <= 100...

问题 : 巨大的数 时间限制: 1Sec 内存限制: 128MB 题目描述 给你n个数 ai&#xff0c;求这n个数相乘之后的积的个位数字是多少&#xff0c;0 < n,ai < 100 输入 共两行&#xff0c;第一行为n的值&#xff0c;表示有多少个数&#xff0c;第二行为由空格隔开的n个数 …

源码解析Flink源节点数据读取是如何与checkpoint串行执行

文章目录 源码解析Flink源节点数据读取是如何与checkpoint串行执行Checkpoint阶段StreamTask类变量actionExecutor的实现和初始化小结 数据读取阶段小结 总结 源码解析Flink源节点数据读取是如何与checkpoint串行执行 Flink版本&#xff1a;1.13.6 前置知识&#xff1a;源节点…

三天从零快速入门React

前言 React 官网文档比较完善&#xff0c;本文更注重结合实际项目中常见的问题&#xff0c;来介绍 React 的用法 Fun Facts ReactVueAngularNPM weekly downloads &#xff08;由于 cnpm 无法查看包&#xff0c;数据不全&#xff09;12,635,9662,662,666823,653Dependents59…

AI深度学习部署全记录

AI部署流程&#xff0c;以PyTorch为例&#xff1a; 1.Torch.Model->ONNX->ONNXSIM->TensortRT->落地 2.Torch.Model->Pt->ONNX->ONNXRunTime->落地 3.Torch.Model->Pt->Libtorch->落地 4.Torch.Model->PNNX->TensorRT->落地 5.…

sql刷题

文章目录 section A1 各部门工资最高的员工&#xff08;难度&#xff1a;中等&#xff09;2 换座位&#xff08;难度&#xff1a;中等&#xff09;3 分数排名&#xff08;难度&#xff1a;中等&#xff09;4 连续出现的数字&#xff08;难度&#xff1a;中等&#xff09;5 树节…

GD32F103VE串口中断发送和接收

GD32F103VE串口中断发送和接收&#xff0c;本程序基于RS485完成测试&#xff0c;实现将收到的数据&#xff0c;再发送出去。 #include "USART1_Interrupt.h" #include "stdio.h" //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf() #inclu…

什么是 API 安全?学习如何防止攻击和保护数据

随着 API 技术的普及&#xff0c;API 安全成为了一个越来越重要的问题。本文将介绍什么是 API 安全&#xff0c;以及目前 API 面临的安全问题和相应的解决方案。 什么是 API 安全 API 安全是指保护 API 免受恶意攻击和滥用的安全措施。API 安全通常包括以下几个方面&#xff1…

Zabbix监控华为交换机DHCP接口地址池

一、背景 最近工作中遇到一个因为DHCP地址池满载、导致用户无法获取到IP地址的故障&#xff0c;所以在想通过zabbix 监控DHCP地址池的状态、当DHCP 地址池数量小于某个值时触发zabbix告警。 网上找了一下没有相关的文档、和对应的OID值、于是用Python 脚本的方式实现 二、实现效…

电视盒子哪个牌子好?拆机达人揭晓电视盒子品牌排行榜

老赵每天会对各种类型的数码产品进行拆机&#xff0c;对硬件、品控这块非常熟悉&#xff0c;近期很多朋友问我电视盒子哪个牌子好&#xff0c;我整理了目前市面上硬件、软件都表现不错的电视盒子品牌排行榜&#xff0c;看看目前最值得入手的电视盒子都有哪些。 第一&#xff1a…

无涯教程-Perl - getnetent函数

描述 此函数从/etc/networks文件获取下一个条目,返回-($name,$aliases,$addrtype,$net) 如果/etc/networks文件为空,则它将不返回任何内容,并且调用将失败。 语法 以下是此函数的简单语法- getnetent返回值 此函数在错误时返回undef,否则在标量context中返回网络地址,在错…

高质量api接口对接及Python示例代码

当我们需要将不同系统或服务进行对接时&#xff0c;接口对接是一种常见的解决方案。我将介绍如何使用Python进行接口对接&#xff0c;并提供示例代码。 首先&#xff0c;我们需要导入Python的requests库&#xff0c;它是一个常用的HTTP请求库&#xff0c;可以方便地发送HTTP请求…

第九次作业

1. SSL工作过程是什么&#xff1f; 当客户端向一个 https 网站发起请求时&#xff0c;服务器会将 SSL 证书发送给客户端进行校验&#xff0c;SSL 证书中包含一个公钥。校验成功后&#xff0c;客户端会生成一个随机串&#xff0c;并使用受访网站的 SSL 证书公钥进行加密&#xf…

提升城市管理效率,软件机器人助力自动化处理投诉、建议、举报

在现代城市管理中&#xff0c;市民的投诉、建议和举报等事项是不可忽视的重要环节。然而&#xff0c;传统的处理方式往往需要大量的人力和时间&#xff0c;效率较低。为了提升城市管理部门的服务质量和效率&#xff0c;引入软件机器人成为一种可行的选择。 博为小帮软件机器人可…

Python京东商品详情页数据采集方法,京东 API 接口介绍

京东详情接口 API 是开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取商品的详细信息&#xff0c;包括商品的标题、描述、图片等信息。在电商平台的开发中&#xff0c;详情接口 API 是非常常用的 API&#xff0c;因此本文将详细介绍详情接口 API 的使用。 一、京…

运算符重载---1

运算符重载---1 //运算符重载//内置类型可以直接使用运算符运算&#xff0c;编译器知道要如何运算。 //但自定义类型无法直接使用运算符&#xff0c;因为编译器不知道要如何运算。如果想支持&#xff0c;自己实现运算符重载即可。// C为了增强 代码的可读性 引入了运算符重载&a…

手搓单链表

文章目录 前言一、链表和顺序表的区别二、什么是单链表单链表分类单链表的结构 三、带头不循环单链表1.单链表的结构体2.带头不循环单链表的初始化和销毁3.带头不循环单链表的头插&#xff0c;尾插和打印4.带头不循环单链表的头删和尾删5.带头不循环单链表的查找&#xff0c;指…

进程通信常见方式

目录 通信通信概述 通信的主要方式 进程同步机制--低级进程通信 高级通信工具 共享存储器系统(Shared-Memory System&#xff09; 管道(pipe)通信系统 客户机-服务器系统(Client-Server system)---套接字&#xff08;Socket&#xff09; 客户机-服务器系统(Client-Serv…

国内什么牌子的ipad手写笔好用?适合绘画电容笔推荐

对于那些想要用ipad来学习的人来说&#xff0c;苹果Pencil是必不可少的。但是&#xff0c;Apple Pencil的价格真的太贵了&#xff0c;以至于很多人都买不起。所以&#xff0c;最好的办法就是选用一支平替的电容笔。本人从前几年就开始使用iPad&#xff0c;同时本身也是一位数码…