Go中的MongoDB

这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战

mongoDB

mongoDB是一个基于分布式文件存储的数据库介于关系数据库和非关系数据库之间

将一条数据存储为一个文档, 其中文档相当于JSON对象

mongoDB和关系型数据库概念对比

SQL MongoDB 说明
databse database 数据库
table collection 数据集
row document 文档
column field 字段

mongoDB的安装

使用brew命令来安装

第一步安装mongodb/brew

 brew tap mongodb/brew
复制代码

第二步安装mongodb

 brew install mongodb-community
复制代码

mongoDB的开启

 mongod --config /usr/local/etc/mongod.conf
复制代码

下载mongoDB的驱动

 go get github.com/mongodb/mongo-go-driver
复制代码

导入mongoDB驱动包

 import (
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
 )
复制代码

连接mongoDB

 // 定义一个全局的数据集
 var (
   collection *mongo.Collection
 )
 ​
 // Student 定义一个结构体
 type Student struct {
   Name string
   Age int64
 }
 ​
 // 连接mongodb
 opt := options.Client().ApplyURI("mongodb://localhost:27017")
 c, err := mongo.Connect(context.TODO(), opt)
 if err != nil {
    fmt.Println("mongo connect failed: ", err)
    return
 }
 fmt.Println("mongo connect succeed!")
 ​
 // 检查连接
 err = c.Ping(context.TODO(), nil)
 if err != nil {
    fmt.Println("mongo ping failed: ", err)
    return
 }
 fmt.Println("mongo ping succeed!")
 ​
 // 从数据库go_mongo, 获取student表
 collection = c.Database("go_mongo").Collection("student")
 ​
 // 关闭连接
 defer func() {
    fmt.Println("mongo closed!")
    c.Disconnect(context.TODO())
 }()
复制代码

添加一条数据

使用InsertOne()方法向数据集中插入一条文档数据

 func insertData() {
    // 创建一个结构体实例
    s1 := Student{
       Name: "shaosiming",
       Age:  18,
    }
    
    res, err := collection.InsertOne(context.TODO(), s1)
    if err != nil {
       fmt.Println("collection insert one data failed: ", err)
       return
    }
    fmt.Println("collection insert one data succeed!")
    fmt.Println(res)
 }
复制代码

添加多条数据

使用insertMany()方法向数据集中添加多条文档数据

 /* 添加多条数据 */
 func insertManyData() {
    // 定义两个Student实例
    s1 := Student{
       Name: "tianming",
       Age:  18,
    }
    s2 := Student{
       Name: "dasiming",
       Age:  20,
    }
    
    // 调用InsertMany方法将数据添加到数据集中
    res, err := collection.InsertMany(context.TODO(), []interface{}{s1, s2})
    if err != nil {
       fmt.Println("collection insert many data failed: ", err)
       return
    }
    fmt.Println("collection insert many data succeed!")
    fmt.Println(res)
 }
复制代码

删除一条数据

使用DeleteOne()方法删除数据集中的跟过滤器匹配的第一条数据

func deleteData() {
  // 创建一个过滤器, 用来查找age为28的文档数据
   filter := bson.D{{"age", 28}}
  
  // 删除跟过滤器相匹配的第一条数据
   res, err := collection.DeleteOne(context.TODO(), filter)
   if err != nil {
      fmt.Println("collection delete failed: ", err)
      return
   }
   fmt.Println("collection delete succeed!")
   fmt.Println(res)
}
复制代码

删除多条数据

调用DeleteMany()方法删除跟过滤器相匹配的全部文档数据

func deleteManyData()  {
   filter := bson.D{{"age", 18}}
   res, err := collection.DeleteMany(context.TODO(), filter)
   if err != nil {
      fmt.Println("collection delete failed: ", err)
      return
   }
   fmt.Println("collection delete succeed!")
   fmt.Println(res)
}
复制代码

更新数据

func updateData() {
   // 过滤器, 匹配name为dasiming的文档
   filter := bson.D{{"name", "dasiming"}}

   // 将匹配的文档进行更新, 设置age字段为10
   update := bson.D{
      {
         "$set", bson.D{
            {"age", 10},
         },
      },
   }
   res, err := collection.UpdateOne(context.TODO(), filter, update)
   if err != nil {
      fmt.Println("collection udpate failed: ", err)
      return
   }
   fmt.Println("collection update succeed!")
   fmt.Println(res)
}
复制代码

查找一条数据

使用FindOne()方法查找跟过滤器相匹配的第一条文档数据

func queryData() {
   filter := bson.D{
      {"name", "shaosiming"},
      //{"age", 18},
   }
   var stu Student
   err := collection.FindOne(context.TODO(), filter).Decode(&stu)
   if err != nil {
      fmt.Println("collection find failed: ", err)
      return
   }
   fmt.Println(stu)
}
复制代码

查找多条数据

/* 查询多条数据 */
func queryManyData()  {
   // 定义一个筛选器, 来查找age为18的文档
   filter := bson.D{
      {"name", "tianming"},
   }
   // Find方法用来查找多条数据
   cur, err := collection.Find(context.TODO(), filter)
   if err != nil {
      fmt.Println("collection find failed: ", err)
      return
   }
   fmt.Println(cur)

   // 存储经过Decode的数据
   var stus []*Student

   // 用来接收每次解码得到的结果
   var stu Student

   // 通过循环游标的Next()方法来获取查找到的数据
   for cur.Next(context.TODO()) {
      err = cur.Decode(&stu)
      if err != nil {
         fmt.Println("cur decode failed: ", err)
         return
      }
      stus = append(stus, &stu)
      fmt.Println(stu)
   }

   // 关闭游标
   defer func() {
      fmt.Println("cursor closed!")
      cur.Close(context.TODO())
   }()

   // 查看结果
   fmt.Println("查询到的学生姓名为tianming的有: ", stus)
   for i, student := range stus {
      fmt.Println(i, ": ", student.Name)
   }
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享