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

golang mongodb

看代码吧

package main// 链接案例 https://www.mongodb.com/docs/drivers/go/current/fundamentals/connection/#connection-example
// 快速入门 https://www.mongodb.com/docs/drivers/go/current/quick-start/
import ("context""fmt""log""time""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/bson/primitive""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"
)var client *mongo.Client    //实例
var mondb *mongo.Database   //数据库,相当于 dbname
var tab11 *mongo.Collection //集合,相当于表
var err errorfunc init() {url := "mongodb://192.168.0.60:27017//"client, err = mongo.Connect(context.TODO(), options.Client().SetConnectTimeout(time.Second*10).ApplyURI(url)) //实例if err != nil {log.Fatal(err)}mondb = client.Database("test11")tab11 = mondb.Collection("tab11")
}// 定义结构体
type student struct {ID   primitive.ObjectID `bson:"_id,omitempty"`Name stringAge  int
}// 结构体方法,自定义输出
func (s student) String() string {return fmt.Sprintf("%v %v %v", s.ID, s.Name, s.Age)
}// 插入一行
func insertone() {stu1 := student{Name: "Zhangs", Age: 66}result, err := tab11.InsertOne(context.TODO(), stu1)if err != nil {fmt.Printf("err: %v\n", err)}fmt.Printf("result: %v\n", result.InsertedID)
}// 插入多行
func insertmany() {stu2 := []any{student{Name: "a", Age: 66},student{Name: "bb", Age: 88},}results, err := tab11.InsertMany(context.TODO(), stu2)// results, err := tab11.InsertMany(context.TODO(), []any{student{Name: "a", Age: 22}, student{Name: "aa", Age: 98}})if err != nil {fmt.Printf("err: %v\n", err)}fmt.Printf("results.InsertedIDs: %v\n", results.InsertedIDs)
}// 查询一行
func findone() {// m1 := map[string]string{"name": "zhanggs", "age": "33"}filter := bson.M{"name": "Zhangs", "age": 66} //name  age 小写var s2 studentresult := tab11.FindOne(context.TODO(), filter)if result.Err() != nil {fmt.Printf("result.Err(): %v\n", result.Err())}err := result.Decode(&s2)if err != nil {fmt.Printf("err: %v\n", err)}fmt.Printf("s2: %v\n", s2)
}// 多条查询 一次性全部装入[]student
func findmany() {var s3 []studentfilter := bson.M{"name": "a", "age": bson.M{"$gt": 1}} //name  age 小写// filter := bson.M{} //无条件,全部符合cursor, err := tab11.Find(context.TODO(), filter) //结果集游标  cursor   *mongo.Cursorif err != nil {log.Fatal(err)}defer cursor.Close(context.TODO()) //关闭游标err = cursor.All(context.TODO(), &s3) //全部装入 切片类型的指针中  results argument must be a pointer to a sliceif err != nil {log.Fatal("Decode err: ", err)}for _, v := range s3 { //遍历,一行行打印出来fmt.Printf("v: %v\n", v)}}// 多条查询,逐条装入
func findmanyv2() {var s3 student //因为是逐条返回,所以这里不是切片[]filter := bson.M{"name": "zhangs", "age": 33} //name  age 小写// filter := bson.M{} //无条件,全部符合cursor, err := tab11.Find(context.TODO(), filter) //结果集游标  cursor   *mongo.Cursorif err != nil {log.Fatal(err)}defer cursor.Close(context.TODO()) //关闭游标for cursor.Next(context.TODO()) {err = cursor.Decode(&s3) //逐条输入if err != nil {log.Fatalf("decode log: %v", s3)}fmt.Printf("s3: %v\n", s3)}
}// 删除一行
func deleteone() {filter := bson.M{"name": "zhangs", "age": 33} //name  age 小写deleteResult, err := tab11.DeleteOne(context.TODO(), filter)if err != nil {log.Fatalf("deleteone : %v", err)}fmt.Printf("deleteResult.DeletedCount: %v\n", deleteResult.DeletedCount)
}// 删除多行
func deletemany() {a := map[string]any{"name": "a", "age": 66}fiter := bson.M(a)deletemanyresult, err := tab11.DeleteMany(context.TODO(), fiter)if err != nil {log.Fatalf("deletemanyresult : %v", err)}fmt.Printf("deletemanyresult.DeletedCount: %v\n", deletemanyresult.DeletedCount) //返回删除的行数
}// drop集合tab11
func deletecoll() {err = tab11.Drop(context.TODO())if err != nil {log.Fatalf("drop tab11 %v", err)}
}// 查询所有
func findall() {filter := bson.M{}var stu []studentoptions := options.Find().SetLimit(5).SetSort(bson.M{"age": 1})cursor, _ := tab11.Find(context.TODO(), filter, options)err = cursor.All(context.TODO(), &stu)for _, v := range stu {fmt.Printf("v: %v\n", v)}
}// 构造函数-查询
func find(tab *mongo.Collection, filter primitive.M, opts *options.FindOptions) {var stu []studentcursor, err := tab.Find(context.TODO(), filter, opts)if err != nil {log.Fatalf("cursor :%v", err)}err = cursor.All(context.TODO(), &stu)if err != nil {log.Fatalf("cursorAll %v", err)}for _, v := range stu {fmt.Printf("v: %v\n", v)}
}// update 一行
func updateone() {filter := bson.M{"age": 66}updat := bson.M{"$inc": bson.M{"age": +6}} //这里必须使用 更新操作符 $inc   $set   $inc 把age 的值 + 6// opts := options.Update()Result, err := tab11.UpdateOne(context.TODO(), filter, updat)if err != nil {fmt.Printf("updateone: %v\n", err)}fmt.Printf("Result.ModifiedCount: %v\n", Result.ModifiedCount)
}// 更新多行
func updatemany() {filter := bson.M{"name": "a"}update := bson.M{"$set": bson.M{"age": 100}} //这里必须使用 更新操作符 $inc   $set  $set 把age  改为100results, err := tab11.UpdateMany(context.TODO(), filter, update)if err != nil {fmt.Printf("updatemany: %v\n", err)}fmt.Printf("results.ModifiedCount: %v\n", results.ModifiedCount)
}func main() {updatemany()// updateone()// find(tab11, bson.M{}, options.Find().SetSort(bson.M{"age": 1}))// findall()// findone()// insertone()// insertmany()// findmany()// findmanyv2()// deleteone()// deletemany()// deletecoll()
}

排序

降序
options.Find().SetLimit(5).SetSort(bson.M{"age": -1})
升序
options.Find().SetLimit(5).SetSort(bson.M{"age": 1})
查询5条
options.Find().SetLimit(5)

分页

*options.FindOptions.SetSkip(1)  // offset
*options.FindOptions.SetLimit(1) // limit

条件查询
filter := bson.M{“name”: “a”, “age”: bson.M{“$gt”: 1}} //name = a , age > 1

$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':""}}

-------------end

相关文章:

golang mongodb

看代码吧 package main// 链接案例 https://www.mongodb.com/docs/drivers/go/current/fundamentals/connection/#connection-example // 快速入门 https://www.mongodb.com/docs/drivers/go/current/quick-start/ import ("context""fmt""log"…...

docker中的jenkins去配置sonarQube

docker中的jenkins去配置sonarQube 1、拉取sonarQube macdeMacBook-Pro:~ mac$ docker pull sonarqube:8.9.6-community 8.9.6-community: Pulling from library/sonarqube 8572bc8fb8a3: Pull complete 702f1610d53e: Pull complete 8c951e69c28d: Pull complete f95e4f8…...

企业如何实现自己的AI垂直大模型

文章目录 为什么要训练垂直大模型训练垂直大模型有许多潜在的好处训练垂直大模型也存在一些挑战 企业如何实现自己的AI垂直大模型1.确定需求2.收集数据3.准备数据4.训练模型5.评估模型6.部署模型 如何高效实现垂直大模型 ✍创作者:全栈弄潮儿 🏡 个人主页…...

Maven可选依赖和排除依赖简单使用

可选依赖 可选依赖指对外隐藏当前所依赖的资源 在maven_04_dao的pom.xml,在引入maven_03_pojo的时候&#xff0c;添加optional <dependency><groupId>com.rqz</groupId><artifactId>maven_03_pojo</artifactId><version>1.0-SNAPSHOT&…...

“深入探索JVM:Java虚拟机的工作原理解析“

标题&#xff1a;深入探索JVM&#xff1a;Java虚拟机的工作原理解析 摘要&#xff1a;本文将深入探索Java虚拟机&#xff08;JVM&#xff09;的工作原理&#xff0c;从类加载、内存管理、垃圾回收、即时编译器等方面进行详细解析&#xff0c;帮助读者更好地理解JVM的内部机制。…...

Prometheus-各种exporter

文章目录 一、 nginx-prometheus-exporter1 nginx 配置1.1 Nginx 模块支持1.2 Nginx 配置文件配置2 部署 nginx-prometheus-exporter2.1 二进制方式部署2.1.1 解压部署2.1.2 配置 systemd2.1.3 添加 prometheus 的配置2.1.4 Dashborad2.2 docker-compose 方式部署3 可配置的指标…...

小程序的 weiui的使用以及引入

https://wechat-miniprogram.github.io/weui/docs/quickstart.html 网址 1.点进去&#xff0c;在app.json里面配置 在你需要的 页面的 json里面配置&#xff0c;按需引入 然后看文档&#xff0c;再在你的 wxml里面使用就好了...

git目录初始化,并拉取最新代码

现有C:\data目录&#xff0c;将目录初始化&#xff0c;并拉取代码在这里插入代码片 https://gitlab.arsbaibaodun.com/bcx_v5_app/baoan-hangyedcjg.git 1、 git init生成 .git 目录即目录初始化完成&#xff0c;可以进行拉取代码 代码成功拉取到了data目录&#xff0c;默认…...

运筹调度算法工程式招聘情况:技能要求、薪资、工作地

目录 一、前言二、岗位信息三、总结 一、前言 前一段时间&#xff0c;常看到运筹学的老师们在朋友圈转发下面的图片。今天忽然想起这件事&#xff0c;顺势查了一下“调度算法工程师”在Boss直聘上的岗位信息&#xff0c;也整理一下招聘企业所需的“调度”技能。 二、岗位信息…...

css2-BFC是什么?

1、BFC是什么&#xff1f; 在页面布局时&#xff0c;经常会出现以下几种情况&#xff1a; 这个元素高度怎末没了&#xff1f; 这两栏布局怎末没法自适应&#xff1f; 这两个元素的间距怎末有点奇怪的样子&#xff1f; … 原因就是元素之间互相影响&#xff0c;导致了意料之外的…...

Flutter Dart语言(04)库操作

0 说明 该系列教程主要是为有一定语言基础 C/C的程序员&#xff0c;快速学习一门新语言所采用的方法&#xff0c;属于在C/C基础上扩展新语言的模式。 1 自定义库 & 系统自定义库 引入代码如下所示&#xff1a; import xxx.dart; //自定义库引入&#xff0c;xxx为本…...

通向架构师的道路之漫谈使用ThreadLocal改进你的层次的划分

一、什么是ThreadLocal 早在JDK 1.2的版本中就提供java.lang.ThreadLocal&#xff0c;ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ThreadLocal很容易让人望文生义&#xff0c;想当然地认为是一个“本地线…...

springboot全局统一返回处理

文章目录 前言一、统一的返回格式二、全局异常处理三、全局返回处理(装逼用的)总结 前言 项目中一般都会有规定好的接口返回格式,无论成功与失败,一般格式都是不变的,这样是为了方便前后端统一处理,今天就来说下前后端统一处理的较为优雅的方式; 一、统一的返回格式 一般而言…...

C/C++面试经历(一)

目录 1. 说说你对C与C的认识&#xff1f; 2. 说说C的三大特性&#xff1f; 3. 说说C的重载&#xff1f; 4. C语言为什么不支持重载&#xff1f; 5. 说说类的默认成员函数&#xff1f; 6. 类的构造函数为什么不支持虚函数&#xff1f; 7. 说说你对指针和引用的理解&…...

【PostgreSQL】系列之 一 用户创建和授权(三)

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…...

Python连接Hive实例教程

一 Python连接hive环境实例 经在网络查询相关的教程&#xff0c;发现有好多的例子&#xff0c;发现连接底层用的的驱动基本都是pyhive和pyhs2两种第三方库的来连接的 hive,下面将简介windows 10 python 3.10 连接hive的驱动程序方式&#xff0c;开发工具&#xff1a;pycharm …...

Jest和Mocha对比:两者之间有哪些区别?

目录 什么是单元测试&#xff1f; Jest和Mocha介绍 Jest Jest的特点&#xff1a; Jest的使用限制 Mocha Mocha的特点 使用Mocha的限制 Jest和Mocha的全面比较 我们应该使用哪个测试框架&#xff1f; 结论 什么是单元测试&#xff1f; 所谓单元测试&#xff0c;是对软…...

Oracle:merge into用法

文章目录 merge into使用场景merge into语法测试表普通模式 merge使用注意点 merge into MERGE 是 Oracle9i 新增的语法&#xff0c;根据源表对目标表进行匹配查询&#xff0c;匹配成功时更新&#xff0c;不成功时插入 比单独的 update insert 的方式效率要更高&#xff0c;尤…...

【数据结构OJ题】消失的数字

原题链接&#xff1a;https://leetcode.cn/problems/missing-number-lcci/ 目录 1. 题目描述 2. 思路分析 3.代码实现 1. 题目描述 2. 思路分析 方法一&#xff1a;排序遍历&#xff08;下一个数不等于上一个数1&#xff0c;这个下一个数就是消失的数字&#xff09;。 时…...

linux 隔离内核

1、 编辑grub gedit /etc/default/grub 2、修改 GRUB_CMDLINE_LINUX_DEFAULT"quiet splash isolcpus1,3"&#xff08;这里表示1和3两个cpu被隔离,cpu序号从0开始&#xff09; or GRUB_CMDLINE_LINUX"isolcpus1,3" 3、update sudo update-grub 4、查看…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...

比特币:固若金汤的数字堡垒与它的四道防线

第一道防线&#xff1a;机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”&#xff08;Hashing&#xff09;就是一种军事级的加密术&#xff08;SHA-256&#xff09;&#xff0c;能将信函内容&#xff08;交易细节&#xf…...