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)}
}

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

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

相关文章

计算机毕设 flink大数据淘宝用户行为数据实时分析与可视化

文章目录 0 前言1、环境准备1.1 flink 下载相关 jar 包1.2 生成 kafka 数据1.3 开发前的三个小 tip 2、flink-sql 客户端编写运行 sql2.1 创建 kafka 数据源表2.2 指标统计:每小时成交量2.2.1 创建 es 结果表, 存放每小时的成交量2.2.2 执行 sql &#x…

Servlet 与Spring对比!

前言: Spring相关的框架知识,算是目前公司在用的前沿知识了,很重要!! 那么以Spring为基础的框架有几个? 以Spring为基础的框架包括若干模块,其中主要的有Spring Framework、Spring Boot、Spring…

十七、模型构建器(ModelBuilder)快速提取城市建成区——批量将夜光数据投影、转为整型(基于参考比较法)

一、前言 本文以参考比较法提取城市建成区为例,详细介绍如何使用模型构建器(ModelBuilder)提高效率,特别说明一下,模型构建器构建的模型是可以保存成为工具,日后需要使用的时候可以直接使用工具不用重复构建,因为模型构建器构建的工作流如果不保存,下次就不能使用,需…

Mybatis基础

文章目录 Mybatis基础XML语言概述使用Mybatis配置Mybatis增删改查复杂查询事务操作动态 SQLifchoose、when、otherwise 缓存机制注解开发 Mybatis基础 虽然我们能够通过JDBC来连接和操作数据库,但是哪怕只是完成一个SQL语句的执行,都需要编写大量的代码…

【Python入门教程】基于OpenCV视频分解成图片+图片组合成视频(视频抽帧组帧)

在人工智能爆火的今天,深度学习被广泛应用于各个领域。深度学习的模型训练离不开大量的样本库。我之前分享过【Python爬虫】批量爬取网页的图片&制作数据集,今天跟大家分享一下如何使用OpenCV库对视频进行抽帧,从而增加样本图片的数量。正…

Operator开发之operator-sdk入门

1 operator-sdk 除了kubebuilder,operator-sdk是另一个常用的用于开发Operator的框架,不过operator-sdk还是基于kubebuilder,因此,通常还是建议使用kubebuilder开发Operator。 2 环境准备 跟kubebuilder类似,需要安…

Tensorflow2 中模型训练标签顺序和预测结果标签顺序不一致问题解决办法

本篇文章将详细介绍Tensorflow2.x中模型训练标签顺序和预测结果标签顺序不一致问题,这个问题如果考虑不周,或者标签顺序没有控制好的情况下会出现预测结果精度极其不准确的情况。 训练数据集的结构:数据集有超过10的类别数,这里包…

【Java 进阶篇】Java HTTP 请求消息详解

HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的应用层协议,广泛用于构建互联网应用。在Java中,我们经常需要发送HTTP请求来与远程服务器进行通信。本文将详细介绍Java中HTTP请求消息的各个部分,包括请求行、…

shouldComponentUpdate 是做什么的?

目录 前言 生命周期函数 shouldComponentUpdate 的写法和用法 代码 事件和API 优缺点 方法 总结 理论 结论 shouldComponentUpdate 是 React 类组件中的一个生命周期方法,用于决定一个组件的 props 或 state 发生变化时是否应该重新渲染。默认情况下&…

什么是离岸金融 (OFFSHORE FINANCE)

什么是离岸金融 离岸金融(Offshore Finance)是指在国外或离岸地区开设金融账户、进行金融交易或管理金融资产的金融实践。这通常涉及将资金、投资、银行账户或金融交易放置在国外的特殊地区或国家,以获得各种金融和税收优惠。离岸金融的目的…

设计模式--7个原则

单一职责原则:一个类负责一项职责。 里氏替换原则:继承与派生的规则。 依赖倒置原则:高层模块不应该依赖基层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程&#xff0…

Linux系统下DHCP服务安装部署和使用实例详解(蜜罐)

目录 一、概述 二、具体配置如下: 一、概述 DHCP :动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途&…

公司电脑如何限制安装软件

公司电脑如何限制安装软件 安企神终端管理系统下载使用 在企业环境中,电脑已经成为企业中必不可少的办公工具,确保员工的生产力和公司的信息安全是至关重要的。为了实现这一目标,公司可能会限制员工在某些情况下安装软件或者由管理员来为终…

可以实时监控屏幕的电脑监控软件

电脑已经成为了人们工作和生活不可或缺的工具。然而,这也带来了诸多安全问题。一些人可能会利用电脑进行不恰当的操作,如聊天、游戏、观看视频等,甚至会泄露公司的商业机密。 电脑监控软件的定义 电脑监控软件是一种用于监控电脑使用情况的软…

【Docker】Docker的网络

Docker提供了多种内置的网络模式,用于在容器之间建立网络连接。这些网络模式,包括桥接网络、主机网络、无网络模式。我们将主要探讨每种网络模式的优缺点、适用场景。 桥接网络 桥接网络是Docker的默认网络模式。在桥接网络中,Docker会为每…

数字音频工作站软件 Ableton Live 11 mac中文软件特点与功能

Ableton Live 11 mac是一款数字音频工作站软件,用于音乐制作、录音、混音和现场演出。它由Ableton公司开发,是一款极其流行的音乐制作软件之一。 Ableton Live 11 mac软件特点和功能 Comping功能:Live 11增加了Comping功能,允许用…

PHP:json_encode和json_decode用法

json_encode 函数用于将 PHP 数据结构转换为 JSON 字符串。json_decode 函数用于将 JSON 字符串转换为 PHP 数据结构。 // 将 PHP 数据结构转换为 JSON 字符串 $data ["name" > "John","age" > 25,"city" > "New York&…

【Ansible自动化运维工具 1】Ansible常用模块详解(附各模块应用实例和Ansible环境安装部署)

Ansible常用模块 一、Ansible1.1 简介1.2 工作原理1.3 Ansible的特性1.3.1 特性一:Agentless,即无Agent的存在1.3.2 特性二:幂等性 1.4 Ansible的基本组件 二、Ansible环境安装部署2.1 安装ansible2.2 查看基本信息2.3 配置远程主机清单 三、…

elementUI el-collapse 自定义折叠面板icon 和 样式 或文字展开收起

: :v-deep{.el-collapse-item__arrow {width: 40px;}.el-icon-arrow-right:before {content: "展开";font-size: 15px;font-family: heiti;color: #2295ff;font-weight: bold;}.el-collapse-item__arrow.is-active {transform: none;}.el-collapse-item__arrow.is-a…

vue中,js获取svg内容并填充到svg图中

js获取svg内容并填充到svg图中 最近遇到一个需求,要求前端通过接口获取svg中的内容,并且填充到svg图中,接下来我就记录一下整个实现过程。 第一步,找到svg图中每一个需要填充的数据的key值,把所有key值交给后端&…