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

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

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

相关文章

招投标系统简介 招投标系统源码 java招投标系统 招投标系统功能设计

功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&…

c++游戏框架

游戏类 class Sprite { public:Sprite(int x, int y, int w, int h, const char* imagePath);~Sprite();void render(SDL_Renderer* renderer);void move(int x, int y); private:SDL_Texture* texture_;SDL_Rect rect_; }; 物理引擎类 class PhysicsEngine { public:Physi…

【数据结构】二叉树、二叉搜索树、平衡二叉树、红黑树、B树、B+树

概述 二叉树(Binary Tree):每个节点最多有两个子节点(左子节点和右子节点),没有限制节点的顺序。特点是简单直观,易于实现,但查找效率较低。 二叉搜索树(Binary Search…

Redis设置hash,为不同的field设置不同的过期时间

Redis设置hash,为不同的field设置不同的过期时间 一、背景需求二、具体要求三、代码实现 一、背景需求 最近做了一个小需求,由于系统对接,导致我们的系统在高峰的时候CPU飙升,所以需要在高峰的时候保护系统进程不受影响。 而且还…

烘焙小程序蛋糕店烘焙店源码点心店小程序源码

本系统开发使用JAVA技术栈开发 使用uniapp技术栈 支持微信小程序 ,对接打印机,对接第三方同城跑腿平台 用户端使用:uniapp 管理端使用:vueelementui 后台服务使用:springbootjpa

Java版本工程行业管理系统源码-专业的工程管理软件-提供一站式服务 em

​ 工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

科大讯飞-鸟类分类挑战赛-测试【1】

科大讯飞-鸟类分类挑战赛-测试【1】 1. 比赛说明2. EfficientNet测试2.1 **模型搭建:**2.2 **模型训练:**2.3 训练过程可视化2.4 一些报错解决:1. 比赛说明 背景: 随着生态环境的不断变化和人类对自然资源的过度开发,世界各地的鸟类数量和种类正在发生着巨大的变化。为了更…

网络OSI七层模型解析

在整理笔记时发现了该文章,也不记得是当时自己学习时的感悟还是记录的别人的精华了,感觉写的挺好,就放到博客上了,自己闲时可以看看,其他人有需求也可以瞅瞅。 1 物理层【比特】 首先解决两台物理机之间的通信需求&a…

不同语言操作符的优先级

看到标题,可能会心生疑惑: 这么基础且重要的操作,不同语言不应该是一致的吗? 并不一定,比如对于右移运算和加法运算,Go就与其他多数语言表现得不一致: Go: package mainimport "fmt"func main() …

Vault数据备份恢复-MySQL

前言 Vault提供了可靠的功能来保护数据库和其他关键数据。 对于MySQL数据库,Vault提供了一个易于使用的解决方案,可以自动创建和管理定期备份,并支持从备份中快速恢复数据。本文将介绍Vault后端存储MySQL的备份恢复,包括如何设置Vault、如何进行数据备份和还原、如何保护…

分布式天梯图算法在 Redis 图数据库中的应用

分布式天梯图算法在 Redis 图数据库中的应用 一、简介1 天梯图算法2 天梯图算法在Redis的应用 二、Redis分布式天梯图算法设计与优化1 基于天梯图的分布式算法设计2 多节点扩展与负载均衡优化3 数据存储方案与压缩策略 三、技术实现3.1 系统架构设计3.2 技术选型3.3 关键实现细…

前端工作常见数组数据处理的一些场景总结

一.对于数组进行修饰返回一个新的数组; 01.描述。 我们工作常常会发现后端传过来的数据有些不仅仅键值为空,甚至都没有键,也就是我们常说的属性名,那我们就需要去修改一下,返回一个结构正常的数据; 02.代…

iOS——Block two

Block 的实质究竟是什么呢?类型?变量?还是什么黑科技? Blocks 是 带有局部变量的匿名函数 Blocks 由 OC 转 C 源码方法 在项目中添加 blocks.m 文件,并写好 block 的相关代码。打开「终端」,执行 cd XX…

k8s新建集群官方指导文档

官方文档可能标的不清晰,在create cluster里面没有给具体怎么操作。 他主要是用这个kubeadm插件来进行新建集群的,我问过网站作者。 官方的tutorial在这里,其实还是步骤蛮多的。

[C++]01.基础,数据类型,运算符

01.基础,数据类型,运算符 一.C基础入门1.HelloWorld2.注释3.变量4.常量5.关键字6.命名规则 二.数据类型1.整形2.sizeof关键字3.浮点型4.字符型5.转义字符6.字符串型7.布尔类型8.数据的输入 三.运算符1.算数运算符2.赋值运算符3.比较运算符4.逻辑运算符 一.C基础入门 1.HelloWo…

Ubuntu新装系统报错:sudo: vim:找不到命令

问题: 新安装的老版本Ubuntu系统,发现在使用vim命令的时候报错: sudo:vim:找不到命令 解决办法 这是因为没有安装vim,直接运行下面命令安装vim sudo apt-get install vim

webshell详解

Webshell详解 一、 Webshell 介绍二 、 基础常见webshell案例 一、 Webshell 介绍 概念 webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与…

Eureka 学习笔记4:客户端 DiscoveryClient

版本 awsVersion ‘1.11.277’ DiscoveryClient # cacheRefreshTask // 配置shouldFetchRegistry if (clientConfig.shouldFetchRegistry()) {// 配置client.refresh.intervalint registryFetchIntervalSeconds clientConfig.getRegistryFetchIntervalSeconds();// 配置expB…

【普通人维护windows的方法,不中毒,不弹窗,不卡顿】

前言 IT人也是普通人,我就说说普通人维护电脑的方法。 我的电脑配置 给大家看看,配置一般,运行软件和游戏,可以保持基本流程 日常维护措施 我不太喜欢设定一些非主流的配置,下了一个360卫士,360其他的套餐可以不用下…

跨站脚本攻击(XSS)

1 什么是XSS跨站脚本攻击问题? XSS是跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web…