Go --- 简单操作MongoDB

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: Go --- 简单操作MongoDB

依赖包的选择:

impor "go.mongodb.org/mongo-driver/mongo"

go.mod中写入

require go.mongodb.org/mongo-driver v1.9.0

连接

简单连接

// 简单连接
func main() {
  clientOpts := options.Client().ApplyURI("mongodb://localhost:27017/?connect=direct")
  client, err := mongo.Connect(context.TODO(), clientOpts)
  if err != nil {
    log.Fatal(err)
  }
  // context.Background() 一般只是用来做测试或是初始化使用,因为没有上下文,而且也没有设置截止时间
  if ok := client.Ping(context.TODO(), clientOpts.ReadPreference);ok == nil {
    fmt.Println("Connected to MongoDB!")
  }
}

分片连接

// shard分片连接
func main() {
   clientOpts := options.Client().ApplyURI("mongodb://localhost:27017,localhost:27018")
   client, err := mongo.Connect(context.TODO(), clientOpts)
   if err != nil {
      log.Fatal(err)
   }
   err = client.Ping(context.TODO(), clientOpts.ReadPreference)
   if err == nil {
      fmt.Println("Pong")
   }
}

操作

结构体

// User 如果字段不大写的话mongoDB就没办法插入该字段
type User struct {
  Id int64
  Name string
  Password  string
}

insert, err := collection.InsertOne(context.TODO(),User{Id: 1,Name: "张三",Password: "123"})
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println("插入一条数据",insert.InsertedID)
  // 插入多个文档
  users := []interface{}{User{Id: 2,Name: "李四",Password: "abc"},User{Id: 3,Name: "王五",Password: "hhh"}}
  insertMany, err := collection.InsertMany(context.TODO(), users)
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println("插入多条数据",insertMany.InsertedIDs)

// 获取单条信息
var result User
err = collection.FindOne(context.TODO(), bson.D{{}}).Decode(&result)
if err != nil {
   log.Fatal(err)
}
fmt.Printf("单条查询结果为 %+v\n",result)
// 获取多条信息
findOptions := options.Find()
findOptions.SetLimit(2)
// 获取多条信息并返回一个游标
cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)
if err != nil {
  log.Fatal(err)
}
// 通过迭代获取所有信息
for cur.Next(context.TODO()) {
  var elem User
  err := cur.Decode(&elem)
  if err != nil {
    log.Fatal(err)
  }
  results = append(results, elem)
}
if err := cur.Err(); err != nil {
    log.Fatal(err)
}
// 查询结束后关闭游标
cur.Close(context.TODO())
fmt.Printf("查询多条数据%+v\n",results)

// 更新一条数据
filter := bson.D{{"name","张三"}}
update := bson.D{{
   "$set",bson.D{
      {"Password","321"},
   },
}}
updateOne, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
   log.Fatal(err)
}
fmt.Println("更新一条数据",updateOne.ModifiedCount)

// 删除所有数据
many, err := collection.DeleteMany(context.TODO(), bson.D{{}})
if err != nil {
  log.Fatal(err)
}
fmt.Println("删除所有数据",many.DeletedCount)

完整代码

// 简单连接
func main() {
  clientOpts := options.Client().ApplyURI("mongodb://localhost:27017/?connect=direct")
  client, err := mongo.Connect(context.TODO(), clientOpts)
  if err != nil {
    log.Fatal(err)
  }
  // context.Background() 一般只是用来做测试或是初始化使用,因为没有上下文,而且也没有设置截止时间
  if ok := client.Ping(context.TODO(), clientOpts.ReadPreference);ok == nil {
    fmt.Println("Connected to MongoDB!")
  }
  // 断开连接
  defer func() {
    err = client.Disconnect(context.TODO())
    if err != nil {
      log.Fatal(err)
    }
  }()
  // 获取一个集合
  collection := client.Database("test").Collection("user")
  // 删除所有数据
  many, err := collection.DeleteMany(context.TODO(), bson.D{{}})
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println("删除所有数据",many.DeletedCount)
  // 插入一个文档
  insert, err := collection.InsertOne(context.TODO(),User{Id: 1,Name: "张三",Password: "123"})
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println("插入一条数据",insert.InsertedID)
  // 插入多个文档
  users := []interface{}{User{Id: 2,Name: "李四",Password: "abc"},User{Id: 3,Name: "王五",Password: "hhh"}}
  insertMany, err := collection.InsertMany(context.TODO(), users)
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println("插入多条数据",insertMany.InsertedIDs)
  // 获取单条信息
  var result User
  err = collection.FindOne(context.TODO(), bson.D{{}}).Decode(&result)
  if err != nil {
    log.Fatal(err)
  }
  fmt.Printf("单条查询结果为 %+v\n",result)
  // 更新一条数据
  filter := bson.D{{"name","张三"}}
  update := bson.D{{
    "$set",bson.D{
      {"Password","321"},
    },
  }}
  updateOne, err := collection.UpdateOne(context.TODO(), filter, update)
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println("更新一条数据",updateOne.ModifiedCount)
  // 获取多条信息
  findOptions := options.Find()
  findOptions.SetLimit(2)
  var results []User
  // 获取多条信息并返回一个游标
  cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)
  if err != nil {
    log.Fatal(err)
  }
  // 通过迭代获取所有信息
  for cur.Next(context.TODO()) {
    var elem User
    err := cur.Decode(&elem)
    if err != nil {
      log.Fatal(err)
    }
    results = append(results, elem)
  }
  if err := cur.Err(); err != nil {
    log.Fatal(err)
  }
  // 查询结束后关闭游标
  cur.Close(context.TODO())
  fmt.Printf("查询多条数据%+v\n",results)
}
// User 如果字段不大写的话mongoDB就没办法插入该字段
type User struct {
  Id int64
  Name string
  Password  string
}


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
5月前
|
SQL 关系型数据库 MySQL
go 通过sql操作mysql
go 通过sql操作mysql
30 1
|
3月前
|
存储 NoSQL Go
Go 使用 MongoDB
Go 使用 MongoDB
32 8
|
3月前
|
人工智能 NoSQL Go
Go MongoDB Driver 实例
Go MongoDB Driver 实例
20 1
|
3月前
|
人工智能 JSON NoSQL
Go MongoDB Driver 中的 A D M E 类型是什么
Go MongoDB Driver 中的 A D M E 类型是什么
36 1
|
4月前
|
DataWorks NoSQL fastjson
DataWorks操作报错合集之DataX进行MongoDB全量迁移的过程中,DataX的MongoDB Reader插件在初始化阶段找不到Fastjson 2.x版本的类库,该怎么办
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
5月前
|
监控 Go
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
|
4月前
|
分布式计算 大数据 Go
MaxCompute操作报错合集之使用go sdk调用GetTunnelEndpoint出现报错:InvalidAction.NotFoundSpecified api is not found,该如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
4月前
|
运维 Devops API
阿里云云效操作报错合集之直接用API调用可以使用,但是本地用Go代码调用失败,是什么导致的?
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
5月前
|
关系型数据库 MySQL Go
Go语言介绍以及如何在Go语言中操作MySQL数据库
Go语言介绍以及如何在Go语言中操作MySQL数据库
58 3
|
5月前
|
运维 前端开发 Unix
用Go实现Ping操作
**摘要:** 本文介绍了 Ping 操作的原理和用途,并展示了如何用 Go 语言实现一个简单的 Ping 工具。Ping 是一个用于测试网络连接可达性和测量往返时间(RTT)的工具,常用于网络故障排查和监测网络稳定性。文中详细讲解了 ICMP 报文的结构,以及如何构建和发送 ICMP 请求报文,包括设置类型、代码、校验和、ID 和序列号等。通过示例代码,演示了如何编写 Go 代码实现 Ping 功能,包括计算校验和、设置超时、发送和接收数据包等步骤。