Go 语言操作 MongoDb
文章目录
- 连接数据库
- 插入数据库
- 插入一条数据
- 批量插入数据
- 查询数据
- 用 BSON 进行复合查询
- 聚合查询
- 更新数据
- 删除数据
连接数据库
package mainimport ("context""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options""log"
)var mgoCli *mongo.Clientfunc initDb() {var err errorclientOptions := options.Client().ApplyURI("mongodb://localhost:27017")mgoCli, err = mongo.Connect(context.TODO(), clientOptions)if err != nil {log.Fatal(err)}err = mgoCli.Ping(context.TODO(), nil)if err != nil {log.Fatal(err)}
}
func MgoCli() *mongo.Client {if mgoCli == nil {initDb()}return mgoCli
}func main() {//连接数据库var (client = MgoCli()db *mongo.Databasecollection *mongo.Collection)db = client.Database("my_db")collection = db.Collection("my_collection")collection = collection
}
插入数据库
插入一条数据
package mainimport ("context""fmt""go.mongodb.org/mongo-driver/bson/primitive""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options""log""time"
)var mgoCli *mongo.Clientfunc initDb() {var err errorclientOptions := options.Client().ApplyURI("mongodb://localhost:27017")mgoCli, err = mongo.Connect(context.TODO(), clientOptions)if err != nil {log.Fatal(err)}err = mgoCli.Ping(context.TODO(), nil)if err != nil {log.Fatal(err)}
}func MgoCli() *mongo.Client {if mgoCli == nil {initDb()}return mgoCli
}// 插入一条数据
type ExecTime struct {StartTime int64 `bson:"startTime"`EndTime int64 `bson:"endTime"`
}type LogRecord struct {JobName string `bson:"jobName"`Command string `bson:"command"`Err string `bson:"err"`Content string `bson:"content"`Tp ExecTime
}func main() {var (client = MgoCli()err errorcollection *mongo.CollectioniResult *mongo.InsertOneResultid primitive.ObjectID)collection = client.Database("my_db").Collection("my_collection")logRecord := LogRecord{JobName: "job1",Command: "echo 1",Err: "",Content: "1",Tp: ExecTime{StartTime: time.Now().Unix(),EndTime: time.Now().Unix() + 10,},}if iResult, err = collection.InsertOne(context.TODO(), logRecord); err != nil {fmt.Println(err)return}id = iResult.InsertedID.(primitive.ObjectID)fmt.Println("自增 ID", id.Hex())
}
批量插入数据
package mainimport ("context""fmt""go.mongodb.org/mongo-driver/bson/primitive""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options""log""time"
)var mgoCli *mongo.Clientfunc initDb() {var err errorclientOptions := options.Client().ApplyURI("mongodb://localhost:27017")mgoCli, err = mongo.Connect(context.TODO(), clientOptions)if err != nil {log.Fatal(err)}err = mgoCli.Ping(context.TODO(), nil)if err != nil {log.Fatal(err)}
}func MgoCli() *mongo.Client {if mgoCli == nil {initDb()}return mgoCli
}// 插入一条数据
type ExecTime struct {StartTime int64 `bson:"startTime"`EndTime int64 `bson:"endTime"`
}type LogRecord struct {JobName string `bson:"jobName"`Command string `bson:"command"`Err string `bson:"err"`Content string `bson:"content"`Tp ExecTime
}func main() {var (client = MgoCli()err errorcollection *mongo.Collectionresult *mongo.InsertManyResultid primitive.ObjectID)collection = client.Database("my_db").Collection("test")result, err = collection.InsertMany(context.TODO(), []interface{}{LogRecord{JobName: "job1",Command: "echo 1",Err: "",Content: "1",Tp: ExecTime{StartTime: time.Now().Unix(),EndTime: time.Now().Unix() + 10,},},LogRecord{JobName: "job1",Command: "echo 1",Err: "",Content: "1",Tp: ExecTime{StartTime: time.Now().Unix(),EndTime: time.Now().Unix() + 10,},},})if err != nil {log.Fatal(err)}if result == nil {log.Fatal("result nil")}for _, v := range result.InsertedIDs {id = v.(primitive.ObjectID)fmt.Println("自增 ID", id.Hex())}
}
查询数据
package mainimport ("context""fmt""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options""log"
)var mgoCli *mongo.Clientfunc initDb() {var err errorclientOptions := options.Client().ApplyURI("mongodb://localhost:27017")mgoCli, err = mongo.Connect(context.TODO(), clientOptions)if err != nil {log.Fatal(err)}err = mgoCli.Ping(context.TODO(), nil)if err != nil {log.Fatal(err)}
}func MgoCli() *mongo.Client {if mgoCli == nil {initDb()}return mgoCli
}// 插入一条数据
type ExecTime struct {StartTime int64 `bson:"startTime"`EndTime int64 `bson:"endTime"`
}type LogRecord struct {JobName string `bson:"jobName"`Command string `bson:"command"`Err string `bson:"err"`Content string `bson:"content"`Tp ExecTime
}type FindByJobName struct {JobName string `bson:"jobName"`
}func main() {var (client = MgoCli()err errorcollection *mongo.Collectioncursor *mongo.Cursor)collection = client.Database("my_db").Collection("table1")cond := FindByJobName{JobName: "job multil"}findOptions := options.Find().SetSkip(0).SetLimit(2)if cursor, err = collection.Find(context.TODO(), cond, findOptions); err != nil {fmt.Println(err)return}defer func() {if err = cursor.Close(context.TODO()); err != nil {log.Fatal(err)}}()for cursor.Next(context.TODO()) {var lr LogRecordif cursor.Decode(&lr) != nil {fmt.Println(err)return}fmt.Println(lr)}var results []LogRecordif err = cursor.All(context.TODO(), &results); err != nil {log.Fatal(err)}for _, result := range results {fmt.Println(result)}
}
用 BSON 进行复合查询
聚合查询
package mainimport ("context""fmt""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options""log"
)var mgoCli *mongo.Clientfunc initDb() {var err errorclientOptions := options.Client().ApplyURI("mongodb://localhost:27017")mgoCli, err = mongo.Connect(context.TODO(), clientOptions)if err != nil {log.Fatal(err)}err = mgoCli.Ping(context.TODO(), nil)if err != nil {log.Fatal(err)}
}func MgoCli() *mongo.Client {if mgoCli == nil {initDb()}return mgoCli
}func main() {client := MgoCli()collection := client.Database("my_db").Collection("table1")groupStage := mongo.Pipeline{bson.D{{"$group", bson.D{{"_id", "$jobName"},{"countJob", bson.D{{"$sum", 1},}},}},},}cursor, err := collection.Aggregate(context.TODO(), groupStage)if err != nil {log.Fatal(err)}defer func() {err = cursor.Close(context.TODO()) // 修正关闭游标的错误处理if err != nil {log.Fatal(err)}}()var results []bson.Merr = cursor.All(context.TODO(), &results)if err != nil {log.Fatal(err)}for _, result := range results {fmt.Println(result)}
}
更新数据
package mainimport ("context""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options""log"
)var mgoCli *mongo.Clientfunc initDb() {var err errorclientOptions := options.Client().ApplyURI("mongodb://localhost:27017")mgoCli, err = mongo.Connect(context.TODO(), clientOptions)if err != nil {log.Fatal(err)}err = mgoCli.Ping(context.TODO(), nil)if err != nil {log.Fatal(err)}
}func MgoCli() *mongo.Client {if mgoCli == nil {initDb()}return mgoCli
}type UpdateByJobName struct {Command string `bson:"command"`Content string `bson:"content"`
}func main() {var (client = MgoCli()collection *mongo.Collectionerr erroruResult *mongo.UpdateResult)collection = client.Database("my_db").Collection("table1")filter := bson.M{"jobName": "job multil"}// bson.M{"$inc",bson.M{"age",-1,}}//bson.M{"$push",bson.M{"interests","Golang",}}//bson.M{"$pull",bson.M{"interests","Golang",}}update := bson.M{"$set": UpdateByJobName{Command: "byModel",Content: "model",}}if uResult, err = collection.UpdateMany(context.TODO(), filter, update); err != nil {log.Fatal(err)}log.Println(uResult.MatchedCount)
}
删除数据
package mainimport ("context""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options""log""time"
)var mgoCli *mongo.Clientfunc initDb() {var err errorclientOptions := options.Client().ApplyURI("mongodb://localhost:27017")mgoCli, err = mongo.Connect(context.TODO(), clientOptions)if err != nil {log.Fatal(err)}err = mgoCli.Ping(context.TODO(), nil)if err != nil {log.Fatal(err)}
}func MgoCli() *mongo.Client {if mgoCli == nil {initDb()}return mgoCli
}type DeleteCond struct {BeforeCond TimeBeforeCond `bson:"tp.startTime"`
}// startTime小于某时间,使用这种方式可以对想要进行的操作($set、$group等)提前定义
type TimeBeforeCond struct {BeforeTime int64 `bson:"$lt"`
}func main() {var (client = MgoCli()collection *mongo.Collectionerr erroruResult *mongo.DeleteResultdelCond *DeleteCond)collection = client.Database("my_db").Collection("table1")//删除jobName为job0的数据delCond = &DeleteCond{BeforeCond: TimeBeforeCond{BeforeTime: time.Now().Unix()}}if uResult, err = collection.DeleteMany(context.TODO(),delCond); err != nil {log.Fatal(err)}log.Println(uResult.DeletedCount)
}
package mainimport ("context""fmt""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options""log"
)var mgoCli *mongo.Clientfunc initDb() {var err errorclientOptions := options.Client().ApplyURI("mongodb://localhost:27017")mgoCli, err = mongo.Connect(context.TODO(), clientOptions)if err != nil {log.Fatal(err)}err = mgoCli.Ping(context.TODO(), nil)if err != nil {log.Fatal(err)}
}func MgoCli() *mongo.Client {if mgoCli == nil {initDb()}return mgoCli
}// 分组
type Group struct {Group interface{} `bson:"$group"`
}// 求和
type Sum struct {Sum interface{} `bson:"$sum"`
}func main() {var (client = MgoCli()collection *mongo.Collectionerr errorcursor *mongo.Cursor)collection = client.Database("my_db").Collection("table1")groupStage := []Group{}groupStage = append(groupStage, Group{Group: bson.D{{"_id", "$jobName"},{"countJob", Sum{Sum: 1}},},})if cursor, err = collection.Aggregate(context.TODO(),groupStage); err != nil {log.Fatal(err)}defer func() {if err = cursor.Close(context.TODO()); err != nil {log.Fatal(err)}}()var results []bson.Mif err = cursor.All(context.TODO(), &results); err != nil {log.Fatal(err)}for _, result := range results {fmt.Println(result)}
}相关文章:
Go 语言操作 MongoDb
文章目录 连接数据库插入数据库插入一条数据批量插入数据 查询数据用 BSON 进行复合查询聚合查询 更新数据删除数据 连接数据库 package mainimport ("context""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"…...
UE4/5 竖排文字文本
方法一、使用多行文本组件 新建一个Widget Blueprint 添加Text 或者 Editable Text(Multi-Line) 、TextBox(Multi-Line) 组件。 添加文字,调整字号,调整成竖排文字。 在Wrapping (换行)面板中 : 勾选 Auto Wrap te…...
centos jdk 安装
1、oracle官网下载jdk8 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 2、楼主用的以前下载好的安装包jdk-8u111-linux-x64.gz。下载后使用工具如Xftp将安装包上传到/opt目录下,这里随便什么目录都行,并解压安装包。 c…...
【计算机网络】什么是HTTPS?HTTPS为什么是安全的?
【面试经典题】 前言: HTTP最初的设计就是用于数据的共享和传输,并没有考虑到数据的安全性,如窃听风险,篡改风险和冒充风险。HTTPS是在 HTTP 的基础上引入了一个加密层。HTTPS通过数据加密,数据完整性检验和身份认证…...
Windows-Oracle19c 安装详解-含Navicate远程连接配置 - 同时连接Oracle11g和Oracle19c
文章目录 0 说明1 下载链接2 安装:一定要以管理员身份运行,不然后面有可能会报错。3 启动监听4. 登录Oracle4 Navicate远程连接-配置监听4.1 修改监听文件4.2 网络配置助手-配置本地监听端口4.3 Navicate连接成功 5 Navicate同时连接两个Oracle数据库 0 …...
文件权限详解
一、文件类型 ll指令查看文件详细信息中,第一列就是文件类型。 常见的文件类型有: 1、 - :普通文件 (文本、源代码、图片、视频、可执行) 2、 d :目录文件 3、b :块设备 4、c ࿱…...
在声明和定义的一些小坑
1、静态成员变量的初始化 静态成员变量声明在 .h 头文件文件中,初始化应该在 .cpp 源文件中 就会出现"找到一个或多个多重定义的符号",下面的错误 class MyString{public:typedef char* iterator;typedef const char* const_iterator;iterator begin();…...
浏览器事件循环 (event loop)
进程与线程 进程 进程的概念 进程是操作系统中的一个程序或者一个程序的一次执行过程,是一个动态的概念,是程序在执行过程中分配和管理资源的基本单位,是操作系统结构的基础。 简单的来说,就是一个程序运行开辟的一块内存空间&a…...
P1868 饥饿的奶牛
根据题意可以知道是一个动态规划,看完数据范围之后可以知道是一个线性DP。 解决方法有点类似于背包问题,枚举背包的每一个空间。 如果把坐标轴上每个点都看成一个块儿,只需要按顺序求出前 i 个块儿的最大牧草堆数,f[i] 就是前i的…...
【软考系统架构设计师】2021年系统架构师综合知识真题及解析
本文主要分享2021年下半年系统架构师综合知识历年真题以及本人在做题时的所思所想。题目序号有点混乱,可忽略 【01】.某计算机系统页面大小为4K,进程P1的页面变换表如下图所示,看P1要访问数据的逻辑地址为十六进制1B1AH,那么该逻辑地址经过变…...
如何在忘记手机密码或图案时重置 Android 手机?
忘记手机密码或图案是 Android 用户一生中不得不面对的最令人沮丧的事情之一。恢复 Android 设备的唯一方法是在 Android 设备上恢复出厂设置。但许多用户不使用此方法,因为此过程会擦除您设备上可用的所有个人数据。 但是,有一种方法可以在不丢失任何数…...
LeetCode每日一题——2520. Count the Digits That Divide a Number
文章目录 一、题目二、题解 一、题目 2520. Count the Digits That Divide a Number Given an integer num, return the number of digits in num that divide num. An integer val divides nums if nums % val 0. Example 1: Input: num 7 Output: 1 Explanation: 7 di…...
论文阅读——DistilBERT
ArXiv:https://arxiv.org/abs/1910.01108 Train Loss: DistilBERT: DistilBERT具有与BERT相同的一般结构,层数减少2倍,移除token类型嵌入和pooler。从老师那里取一层来初始化学生。 The token-type embeddings and the pooler a…...
202212 青少年等级考试机器人实操真题三级
202212 青少年等级考试机器人实操真题三级 考试时间:60分钟 总分:100 及格分:60 一、问答题 (共1题,每题100分) 1、实际操作(共1题,共100分) 请考生在实操考试结束前将本题作答程序文件按“说明”要求完成上传。 1. 主…...
token正确不报错,token失效后却出现报跨域错误
1.今天在使用koajs开发项目时,突然发现前端配置axios的response获取不到后端定义的token失效内容了,取而代之的是出现了跨域的错误。 2. 我马上去查找koajs的跨域中间件配置,发现配置完好cors,token正确时,接口正常访问…...
STM32中除零运算,为何程序不崩溃?
在 C 语言中,除零运算会导致异常吗? 在 C 语言中,当一个数除以零时,会导致除法运算错误,通常表现为“除以零”错误或被称为“浮点异常”(floating-point exception)。 对于整数除法,…...
sprinbboot 2.7启动不生成日志文件
新增了一个springboot项目,通过idea 调试,并且在idea 的vm options中指定-Dlogging.configclasspath:logback-pro.xml 或者 -Dlogging.configclasspath:logback-dev.xml 都能正常生成对应的日志文件。 部署到测试环境以及生产环境,日志文件却…...
Kafka - 3.x 图解Broker总体工作流程
文章目录 Zk中存储的kafka的信息Kafka Broker总体工作流程1. broker启动后向zk中注册2. Controller谁先启动注册,谁说了算3. 由选举出来的Controller监听brokers节点的变化4. Controller决定leader选举5. Controller将节点信息上传到Zk中6. 其他Controller从zk中同步…...
APP自动化测试 ---- Appium介绍及运行原理
在面试APP自动化时,有的面试官可能会问Appium的运行原理,以下介绍Appium运行原理。 一、Appium介绍 1.Appium概念 Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试。它使用WebDriver协议驱动IOS…...
学习模板发布
学习目标: 提示:这里可以添加学习目标 例如: 一周掌握 Java 入门知识 学习内容: 提示:这里可以添加要学的内容 例如: 搭建 Java 开发环境掌握 Java 基本语法掌握条件语句掌握循环语句 学习时间&#x…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
