当前位置: 首页 > 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、查看…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...