Go --- 简单操作MongoDB

简介: 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
}


相关文章
|
SQL 关系型数据库 MySQL
go 通过sql操作mysql
go 通过sql操作mysql
148 1
|
监控 Go
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
348 1
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
|
人工智能 NoSQL Go
Go MongoDB Driver 实例
Go MongoDB Driver 实例
175 1
|
人工智能 JSON NoSQL
Go MongoDB Driver 中的 A D M E 类型是什么
Go MongoDB Driver 中的 A D M E 类型是什么
202 1
|
DataWorks NoSQL fastjson
DataWorks操作报错合集之DataX进行MongoDB全量迁移的过程中,DataX的MongoDB Reader插件在初始化阶段找不到Fastjson 2.x版本的类库,该怎么办
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
关系型数据库 MySQL Go
Go语言介绍以及如何在Go语言中操作MySQL数据库
Go语言介绍以及如何在Go语言中操作MySQL数据库
246 3
|
运维 前端开发 Unix
用Go实现Ping操作
**摘要:** 本文介绍了 Ping 操作的原理和用途,并展示了如何用 Go 语言实现一个简单的 Ping 工具。Ping 是一个用于测试网络连接可达性和测量往返时间(RTT)的工具,常用于网络故障排查和监测网络稳定性。文中详细讲解了 ICMP 报文的结构,以及如何构建和发送 ICMP 请求报文,包括设置类型、代码、校验和、ID 和序列号等。通过示例代码,演示了如何编写 Go 代码实现 Ping 功能,包括计算校验和、设置超时、发送和接收数据包等步骤。
341 5
|
存储 NoSQL Linux
【MongoDB】下载安装、指令操作
【MongoDB】下载安装、指令操作
592 1
|
分布式计算 DataWorks NoSQL
DataWorks操作报错合集之从MongoDB同步数据到MaxCompute(ODPS)时,出现报错,该怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
DataWorks操作报错合集之从MongoDB同步数据到MaxCompute(ODPS)时,出现报错,该怎么解决