当前位置:首页 > 文章列表 > Golang > Go教程 > 使用GO操作MongoDB的方法

使用GO操作MongoDB的方法

来源:脚本之家 2022-12-31 13:30:13 0浏览 收藏

本篇文章向大家介绍《使用GO操作MongoDB的方法》,主要包括GOMongoDB,具有一定的参考价值,需要的朋友可以参考一下。

安装MongoDB驱动程序

mkdr mongodb 
cd mongodb 
go mod init  
go get go.mongodb.org/mongo-driver/mongo

连接MongoDB

创建一个main.go文件
将以下包导入main.go文件中

package main
import (
   "context"
   "fmt"
   "log"
   "go.mongodb.org/mongo-driver/bson"
   "go.mongodb.org/mongo-driver/mongo"
   "go.mongodb.org/mongo-driver/mongo/options"
   "time"
)

连接MongoDB的URI格式为

mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]

单机版

mongodb://localhost:27017

副本集

mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017 /?replicaSet = myRepl

分片集群

mongodb://mongos0.example.com:27017,mongos1.example.com:27017,mongos2.example.com:27017

mongo.Connect()接受Context和options.ClientOptions对象,该对象用于设置连接字符串和其他驱动程序设置。
通过context.TODO()表示不确定现在使用哪种上下文,但是会在将来添加一个使用Ping方法来检测是否已正常连接MongoDB

func main() {
    clientOptions := options.Client().ApplyURI("mongodb://admin:password@localhost:27017")
    var ctx = context.TODO()
    // Connect to MongoDB
    client, err := mongo.Connect(ctx, clientOptions)
    if err != nil {
        log.Fatal(err)
    }
    // Check the connection
    err = client.Ping(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Connected to MongoDB!")
    defer client.Disconnect(ctx)

列出所有数据库

databases, err := client.ListDatabaseNames(ctx, bson.M{})
if err != nil {
   log.Fatal(err)
}
fmt.Println(databases)

在GO中使用BSON对象
MongoDB中的JSON文档以称为BSON(二进制编码的JSON)的二进制表示形式存储。与其他将JSON数据存储为简单字符串和数字的数据库不同,BSON编码扩展了JSON表示形式,例如int,long,date,float point和decimal128。这使应用程序更容易可靠地处理,排序和比较数据。Go Driver有两种系列用于表示BSON数据:D系列类型和Raw系列类型。
D系列包括四种类型:

D:BSON文档。此类型应用在顺序很重要的场景下,例如MongoDB命令。
M:无序map。除不保留顺序外,与D相同。
A:一个BSON数组。
E:D中的单个元素。
插入数据到MongoDB
插入单条文档

//定义插入数据的结构体
type sunshareboy struct {
    Name string
    Age  int
    City string
}
//连接到test库的sunshare集合,集合不存在会自动创建
collection := client.Database("test").Collection("sunshare")
wanger:=sunshareboy{"wanger",24,"北京"}
insertOne,err :=collection.InsertOne(ctx,wanger)
if err != nil {
    log.Fatal(err)
}
fmt.Println("Inserted a Single Document: ", insertOne.InsertedID)

执行结果如下

同时插入多条文档

collection := client.Database("test").Collection("sunshare")
dongdong:=sunshareboy{"张冬冬",29,"成都"}
huazai:=sunshareboy{"华仔",28,"深圳"}
suxin:=sunshareboy{"素心",24,"甘肃"}
god:=sunshareboy{"刘大仙",24,"杭州"}
qiaoke:=sunshareboy{"乔克",29,"重庆"}
jiang:=sunshareboy{"姜总",24,"上海"}
//插入多条数据要用到切片
boys:=[]interface{}{dongdong,huazai,suxin,god,qiaoke,jiang}
insertMany,err:= collection.InsertMany(ctx,boys)
if err != nil {
    log.Fatal(err)
}
fmt.Println("Inserted multiple documents: ", insertMany.InsertedIDs)

从MongDB中查询数据

查询单个文档

查询单个文档使用collection.FindOne()函数,需要一个filter文档和一个可以将结果解码为其值的指针

var result sunshareboy
filter := bson.D{{"name","wanger"}}
err = collection.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Found a single document: %+v\n", result)

返回结果如下

Connected to MongoDB!
Found a single document: {Name:wanger Age:24 City:北京}
Connection to MongoDB closed.

查询多个文档

查询多个文档使用collection.Find()函数,这个函数会返回一个游标,可以通过他来迭代并解码文档,当迭代完成后,关闭游标

Find函数执行find命令并在集合中的匹配文档上返回Cursor。
filter参数必须是包含查询运算符的文档,并且可以用于选择结果中包括哪些文档。不能为零。空文档(例如bson.D {})应用于包含所有文档。
opts参数可用于指定操作的选项,例如我们可以设置只返回五条文档的限制(https://godoc.org/go.mongodb.org/mongo-driver/mongo/options#Find)。

//定义返回文档数量
    findOptions := options.Find()
    findOptions.SetLimit(5)
    //定义一个切片存储结果
    var results []*sunshareboy
    //将bson.D{{}}作为一个filter来匹配所有文档
    cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)
    if err != nil {
        log.Fatal(err)
    }
    //查找多个文档返回一个游标
    //遍历游标一次解码一个游标
    for cur.Next(context.TODO()) {
        //定义一个文档,将单个文档解码为result
        var result sunshareboy
        err := cur.Decode(&result)
        if err != nil {
            log.Fatal(err)
        }
        results = append(results, &result)
    }
    fmt.Println(result)
    if err := cur.Err(); err != nil {
        log.Fatal(err)
    }
    //遍历结束后关闭游标
    cur.Close(context.TODO())
    fmt.Printf("Found multiple documents (array of pointers): %+v\n", results)

返回结果如下

Connected to MongoDB!
{wanger 24 北京}
{张冬冬 29 成都}
{华仔 28 深圳}
{素心 24 甘肃}
{刘大仙 24 杭州}
Found multiple documents (array of pointers): &[0xc000266450 0xc000266510 0xc000266570 0xc0002665d0 0xc000266630]
Connection to MongoDB closed.

更新MongoDB文档
更新单个文档
更新单个文档使用collection.UpdateOne()函数,需要一个filter来匹配数据库中的文档,还需要使用一个update文档来更新操作

filter参数必须是包含查询运算符的文档,并且可以用于选择要更新的文档。不能为零。如果过滤器不匹配任何文档,则操作将成功,并且将返回MatchCount为0的UpdateResult。如果过滤器匹配多个文档,将从匹配的集合中选择一个,并且MatchedCount等于1。
update参数必须是包含更新运算符的文档(https://docs.mongodb.com/manual/reference/operator/update/),并且可以用于指定要对所选文档进行的修改。它不能为nil或为空。
opts参数可用于指定操作的选项。

filter := bson.D{{"name","张冬冬"}}
//如果过滤的文档不存在,则插入新的文档
opts := options.Update().SetUpsert(true)
update := bson.D{
    {"$set", bson.D{
        {"city", "北京"}},
    }}
result, err := collection.UpdateOne(context.TODO(), filter, update,opts)
if err != nil {
    log.Fatal(err)
}
if result.MatchedCount != 0 {
    fmt.Printf("Matched %v documents and updated %v documents.\n", result.MatchedCount, result.ModifiedCount)
}
if result.UpsertedCount != 0 {
    fmt.Printf("inserted a new document with ID %v\n", result.UpsertedID)
}

返回结果如下

Connected to MongoDB!
Matched 1 documents and updated 1 documents.
Connection to MongoDB closed.

更新多个文档

更新多个文档使用collection.UpdateOne()函数,参数与collection.UpdateOne()函数相同

filter := bson.D{{"city","北京"}}
//如果过滤的文档不存在,则插入新的文档
opts := options.Update().SetUpsert(true)
update := bson.D{
    {"$set", bson.D{
        {"city", "铁岭"}},
    }}
result, err := collection.UpdateMany(context.TODO(), filter, update,opts)
if err != nil {
    log.Fatal(err)
}
if result.MatchedCount != 0 {
    fmt.Printf("Matched %v documents and updated %v documents.\n", result.MatchedCount, result.ModifiedCount)
}
if result.UpsertedCount != 0 {
    fmt.Printf("inserted a new document with ID %v\n", result.UpsertedID)
}

返回结果如下

Connected to MongoDB!
Matched 2 documents and updated 2 documents.
Connection to MongoDB closed.

删除MongoDB文档

可以使用collection.DeleteOne()collection.DeleteMany()删除文档。如果你传递bson.D{{}}作为过滤器参数,它将匹配数据集中的所有文档。还可以使用collection. drop()删除整个数据集。

filter := bson.D{{"city","铁岭"}}
deleteResult, err := collection.DeleteMany(context.TODO(), filter)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Deleted %v documents in the trainers collection\n", deleteResult.DeletedCount)

返回结果如下

Connected to MongoDB!
Deleted 2 documents in the trainers collection
Connection to MongoDB closed.

获取MongoDB服务状态

上面我们介绍了对MongoDB的CRUD,其实还支持很多对mongoDB的操作,例如聚合、事物等,接下来介绍一下使用golang获取MongoDB服务状态,执行后会返回一个bson.Raw类型的数据

ctx, _ = context.WithTimeout(context.Background(), 30*time.Second)
serverStatus, err := client.Database("admin").RunCommand(
    ctx,
    bsonx.Doc{{"serverStatus", bsonx.Int32(1)}},
).DecodeBytes()
if err != nil {
    fmt.Println(err)
}
fmt.Println(serverStatus)
fmt.Println(reflect.TypeOf(serverStatus))
version, err := serverStatus.LookupErr("version")
fmt.Println(version.StringValue())
if err != nil {
    fmt.Println(err)
}

参考链接

https://www.mongodb.com/blog/post/mongodb-go-driver-tutorial
https://godoc.org/go.mongodb.org/mongo-driver/mongo
从MongoDB中查询数据从MongoDB中查询数据从MongoDB中查询数据

好了,本文到此结束,带大家了解了《使用GO操作MongoDB的方法》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
Golang实现AES加密和解密的示例代码Golang实现AES加密和解密的示例代码
上一篇
Golang实现AES加密和解密的示例代码
Go语言实现23种设计模式的使用
下一篇
Go语言实现23种设计模式的使用
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 笔灵AI生成答辩PPT:高效制作学术与职场PPT的利器
    笔灵AI生成答辩PPT
    探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
    20次使用
  • 知网AIGC检测服务系统:精准识别学术文本中的AI生成内容
    知网AIGC检测服务系统
    知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
    29次使用
  • AIGC检测服务:AIbiye助力确保论文原创性
    AIGC检测-Aibiye
    AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
    35次使用
  • 易笔AI论文平台:快速生成高质量学术论文的利器
    易笔AI论文
    易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
    43次使用
  • 笔启AI论文写作平台:多类型论文生成与多语言支持
    笔启AI论文写作平台
    笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
    36次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码