Go --- 简单操作MongoDB

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 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
相关文章
|
1月前
|
Go 索引
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
|
5月前
|
NoSQL JavaScript 前端开发
如何使用 Node.js 连接和操作 MongoDB 数据库?
如何使用 Node.js 连接和操作 MongoDB 数据库?
264 2
|
4月前
|
NoSQL MongoDB Python
深入了解 Python MongoDB 操作:排序、删除、更新、结果限制全面解析
使用 sort() 方法对结果进行升序或降序排序。 sort() 方法接受一个参数用于“字段名”,一个参数用于“方向”(升序是默认方向)。
73 0
|
13天前
|
存储 缓存 NoSQL
【Go语言专栏】Go语言中的Redis操作与缓存应用
【4月更文挑战第30天】本文探讨了在Go语言中使用Redis进行操作和缓存应用的方法。文章介绍了Redis作为高性能键值存储系统,用于提升应用性能。推荐使用`go-redis/redis`库,示例代码展示了连接、设置、获取和删除键值对的基本操作。文章还详细阐述了缓存应用的步骤及常见缓存策略,包括缓存穿透、缓存击穿和缓存雪崩的解决方案。利用Redis和合适策略可有效优化应用性能。
|
6天前
|
Go
|
13天前
|
存储 负载均衡 Go
【Go 语言专栏】使用 Go 语言实现分布式数据库操作
【4月更文挑战第30天】本文探讨了使用Go语言实现分布式数据库操作,强调其在并发性能、网络编程、语法简洁和跨平台性上的优势。关键技术和步骤包括数据分片、数据同步、负载均衡及故障转移。通过实例分析和挑战解决,展示了Go语言在大规模数据处理中的高效与可靠性,为开发者提供指导。
|
13天前
|
存储 NoSQL Go
【Go语言专栏】Go语言中的MongoDB操作与NoSQL应用
【4月更文挑战第30天】本文介绍了Go语言中操作MongoDB的方法和NoSQL应用的优势。MongoDB作为流行的NoSQL数据库,以其文档型数据模型、高性能和可扩展性被广泛应用。在Go语言中,通过mongo-go-driver库可轻松实现与MongoDB的连接及插入、查询、更新和删除等操作。MongoDB在NoSQL应用中的优点包括灵活的数据模型、高性能、高可用性和易于扩展,使其成为处理大规模数据和高并发场景的理想选择。
|
15天前
|
NoSQL MongoDB
MongoDB代码操作
MongoDB代码操作
|
25天前
|
NoSQL MongoDB 数据库
MongoDB黑窗口操作(CRUD)
MongoDB黑窗口操作(CRUD)
|
1月前
|
缓存 NoSQL 关系型数据库
【MongoDB】MongoDB更新操作时是否立刻fsync到磁盘?
【4月更文挑战第2天】【MongoDB】MongoDB更新操作时是否立刻fsync到磁盘?