当前位置:   article > 正文

Go语言操作mongodb_go mongo

go mongo

目录

一、连接mongodb

1.目录结构

2.安装mongodb驱动

3.连接mongodb

二、定义模型

三、添加文档

1.单个添加

 2.批量添加

四、删除文档

1.删除单个

五、更新文档

1.更新单条

2.更新多条

六、查询

1.条件查询

 2.投影查询

3.limit

4.offset

5. order by desc

6.模糊查询

 7.比较查询

8. 包含查询

9. and查询

总结


前言:本文主要演示了如何使用go语言操作mongodb,包括连接mongodb,操作数据等等。


一、连接mongodb

1.目录结构

2.安装mongodb驱动

  1. go get go.mongodb.org/mongo-driver/mongo
  2. go get go.mongodb.org/mongo-driver/mongo/options

3.连接mongodb

  1. package mongodb
  2. import (
  3. "context"
  4. "fmt"
  5. "go.mongodb.org/mongo-driver/mongo"
  6. "go.mongodb.org/mongo-driver/mongo/options"
  7. "time"
  8. )
  9. var client *mongo.Client
  10. var coll *mongo.Collection
  11. func Init() (err error) {
  12. // 1.连接mongodb
  13. client, err = mongo.Connect(context.Background(),
  14. options.Client().ApplyURI("mongodb://localhost:27017").
  15. SetConnectTimeout(5*time.Second))
  16. if err != nil {
  17. fmt.Println(err)
  18. return err
  19. }
  20. if err = client.Ping(context.Background(), nil); err != nil {
  21. fmt.Println(err)
  22. return err
  23. }
  24. // 由于都是对同一个集合进行操作,所以在初始化mongodb时就选择了集合,防止后续出现大量重复代码
  25. coll = client.Database("db").Collection("stu")
  26. return
  27. }
  28. func GetClient() *mongo.Client {
  29. return client
  30. }
  31. func Close() {
  32. _ = client.Disconnect(context.Background())
  33. }

二、定义模型

  1. package models
  2. type Student struct {
  3. ID int `bson:"_id"`
  4. Age int `bson:"age"`
  5. Name string `bson:"name"`
  6. Addr string `bson:"address"`
  7. }

三、添加文档

1.单个添加

  1. package mongodb
  2. import (
  3. "context"
  4. "fmt"
  5. "mongo/models"
  6. )
  7. func InsertStudent(p *models.Student) error {
  8. // 插入文档
  9. if _, err := coll.InsertOne(context.Background(), p); err != nil {
  10. return err
  11. }
  12. fmt.Println("Document inserted successfully!")
  13. return nil
  14. }

 2.批量添加

  1. package mongodb
  2. import (
  3. "context"
  4. "fmt"
  5. "mongo/models"
  6. )
  7. func InsertStudents(p []interface{}) error {
  8. // 插入多条文档
  9. if _, err := coll.InsertMany(context.Background(), p); err != nil {
  10. return err
  11. }
  12. fmt.Println("Document inserted successfully!")
  13. return nil
  14. }
  1. package main
  2. import (
  3. "fmt"
  4. "mongo/models"
  5. "mongo/mongodb"
  6. )
  7. func main() {
  8. // 1.连接mongodb
  9. if err := mongodb.Init(); err != nil {
  10. return
  11. }
  12. defer mongodb.Close()
  13. stus := []interface{}{
  14. models.Student{
  15. ID: 1,
  16. Age: 18,
  17. Name: "alice",
  18. Addr: "beijing",
  19. },
  20. models.Student{
  21. ID: 2,
  22. Age: 19,
  23. Name: "bob",
  24. Addr: "shanghai",
  25. },
  26. models.Student{
  27. ID: 3,
  28. Age: 20,
  29. Name: "charlie",
  30. Addr: "guangzhou",
  31. },
  32. }
  33. if err := mongodb.InsertStudents(stus); err != nil {
  34. return
  35. }
  36. }

四、删除文档

1.删除单个

  1. package mongodb
  2. import (
  3. "context"
  4. "fmt"
  5. "go.mongodb.org/mongo-driver/bson"
  6. )
  7. func DeleteStudent(p int) error {
  8. // 过滤条件
  9. fil := bson.M{"_id": p}
  10. // 删除文档
  11. if _, err := coll.DeleteOne(context.Background(), fil); err != nil {
  12. return err
  13. }
  14. fmt.Println("Document Delete successfully!")
  15. return nil
  16. }

五、更新文档

1.更新单条

  1. package mongodb
  2. import (
  3. "context"
  4. "fmt"
  5. "go.mongodb.org/mongo-driver/bson"
  6. "mongo/models"
  7. )
  8. // UpdateStudent 根据传入的参数进行更新
  9. func UpdateStudent(p *models.Student) error {
  10. // 根据条件筛选要更新的文档
  11. filter := bson.M{"_id": p.ID}
  12. update := bson.M{"$set": p}
  13. // 更新文档
  14. if _, err := coll.UpdateOne(context.Background(), filter, update); err != nil {
  15. return err
  16. }
  17. fmt.Println("Document Update successfully!")
  18. return nil
  19. }

2.更新多条

  1. // UpdateStudents 修改所有符合条件的数据update stu set age = 99 where name = ?
  2. func UpdateStudents(p string) error {
  3. // 根据条件筛选要更新的文档
  4. filter := bson.M{"name": p}
  5. update := bson.M{"$set": bson.M{"age": 99}}
  6. // 更新文档
  7. if _, err := coll.UpdateMany(context.Background(), filter, update); err != nil {
  8. return err
  9. }
  10. fmt.Println("Document Update successfully!")
  11. return nil
  12. }

六、查询

1.条件查询

  1. package mongodb
  2. import (
  3. "context"
  4. "fmt"
  5. "go.mongodb.org/mongo-driver/bson"
  6. "go.mongodb.org/mongo-driver/mongo/options"
  7. "mongo/models"
  8. )
  9. // QueryStudentByID select * from stu where id = ?
  10. func QueryStudentByID(p int) error {
  11. filter := bson.M{"_id": p} // 根据条件筛选要更新的文档
  12. var s models.Student
  13. // 插入文档
  14. err := coll.FindOne(context.Background(), filter).Decode(&s)
  15. if err != nil {
  16. return err
  17. }
  18. fmt.Println("Document Find successfully!")
  19. fmt.Printf("Document Find: %+v", s)
  20. return nil
  21. }

 2.投影查询

  1. // QueryStudentByID1 投影查询,类似select name age from stu where id = ?
  2. func QueryStudentByID1(p int) error {
  3. filter := bson.M{"_id": p} // 根据条件筛选要更新的文档
  4. // 投影选项
  5. d := bson.D{
  6. {"name", 1},
  7. {"age", 1},
  8. }
  9. // 查询文档
  10. res, err := coll.Find(context.Background(), filter, options.Find().SetProjection(d))
  11. if err != nil {
  12. return err
  13. }
  14. fmt.Println("Document Find successfully!")
  15. defer res.Close(context.Background())
  16. var stus []models.Student
  17. if err = res.All(context.Background(), &stus); err != nil {
  18. return err
  19. }
  20. for _, s := range stus {
  21. fmt.Printf("Document found: %+v\n", s)
  22. }
  23. return nil
  24. }

3.limit

  1. // QueryStudent 分页查询 select * from stu limit ?
  2. func QueryStudent(size int64) error {
  3. // 分页选项
  4. l := options.Find().SetLimit(size)
  5. filter := bson.M{}
  6. // 插入文档
  7. res, err := coll.Find(context.TODO(), filter, l)
  8. if err != nil {
  9. return err
  10. }
  11. fmt.Println("Document Find successfully!")
  12. defer res.Close(context.Background())
  13. var stus []models.Student
  14. if err = res.All(context.Background(), &stus); err != nil {
  15. return err
  16. }
  17. for _, s := range stus {
  18. fmt.Printf("Document found: %+v\n", s)
  19. }
  20. return nil
  21. }

4.offset

  1. // QueryStudentByID3 跳过指定数量的数据
  2. func QueryStudentByID3(p int64) error {
  3. // 跳跃选项
  4. l := options.Find().SetSkip(p)
  5. filter := bson.M{}
  6. // 插入文档
  7. res, err := coll.Find(context.TODO(), filter, l)
  8. if err != nil {
  9. return err
  10. }
  11. fmt.Println("Document Find successfully!")
  12. defer res.Close(context.Background())
  13. var stus []models.Student
  14. if err = res.All(context.Background(), &stus); err != nil {
  15. return err
  16. }
  17. for _, s := range stus {
  18. fmt.Printf("Document found: %+v\n", s)
  19. }
  20. return nil
  21. }

5. order by desc

  1. // QueryStudent2 对查询结果进行降序排序,入参为1升序,入参-1降序
  2. func QueryStudent2(p int) error {
  3. // select * from stu order by age desc
  4. // 排序选项
  5. s := options.Find().SetSort(bson.D{{"age", p}})
  6. filter := bson.M{}
  7. // 3.插入文档
  8. res, err := coll.Find(context.TODO(), filter, s)
  9. if err != nil {
  10. return err
  11. }
  12. fmt.Println("Document Find successfully!")
  13. defer res.Close(context.Background())
  14. var stus []models.Student
  15. if err = res.All(context.Background(), &stus); err != nil {
  16. return err
  17. }
  18. for _, s := range stus {
  19. fmt.Printf("Document found: %+v\n", s)
  20. }
  21. return nil
  22. }

6.模糊查询

  1. // QueryStudent3 模糊查询 select * from stu where name like %?%
  2. func QueryStudent3(p string) error {
  3. filter := bson.M{
  4. "name": bson.M{
  5. "$regex": p,
  6. },
  7. }
  8. //filter1 := bson.M{
  9. // "name": bson.M{
  10. // "$regex": fmt.Sprintf("^%s", p), //name like ?%
  11. // },
  12. //}
  13. // 查询
  14. res, err := coll.Find(context.TODO(), filter)
  15. if err != nil {
  16. return err
  17. }
  18. fmt.Println("Document Find successfully!")
  19. defer res.Close(context.Background())
  20. var stus []models.Student
  21. if err = res.All(context.Background(), &stus); err != nil {
  22. return err
  23. }
  24. for _, s := range stus {
  25. fmt.Printf("Document found: %+v\n", s)
  26. }
  27. return nil
  28. }

 7.比较查询

  1. // QueryStudent4 比较查询 select * from stu where age > ?
  2. func QueryStudent4(p int) error {
  3. // 过滤条件
  4. filter := bson.M{
  5. "age": bson.M{
  6. "$gt": p, // age > p
  7. // $lt <
  8. // $gte >=
  9. // $lte <=
  10. // $ne !=
  11. },
  12. }
  13. // 查询
  14. res, err := coll.Find(context.TODO(), filter)
  15. if err != nil {
  16. return err
  17. }
  18. fmt.Println("Document Find successfully!")
  19. defer res.Close(context.Background())
  20. var stus []models.Student
  21. if err = res.All(context.Background(), &stus); err != nil {
  22. return err
  23. }
  24. for _, s := range stus {
  25. fmt.Printf("Document found: %+v\n", s)
  26. }
  27. return nil
  28. }

8. 包含查询

  1. // QueryStudent5 包含查询 select * from stu where age in [s, e]
  2. func QueryStudent5(s, e int) error {
  3. // 过滤条件
  4. filter := bson.M{
  5. "age": bson.M{
  6. "$in": []int{s, e}, // age in [s, e]
  7. // "$nin": []int{s, e}, // age not in [s, e]
  8. },
  9. }
  10. // 查询
  11. res, err := coll.Find(context.TODO(), filter)
  12. if err != nil {
  13. return err
  14. }
  15. fmt.Println("Document Find successfully!")
  16. defer res.Close(context.Background())
  17. var stus []models.Student
  18. if err = res.All(context.Background(), &stus); err != nil {
  19. return err
  20. }
  21. for _, s := range stus {
  22. fmt.Printf("Document found: %+v\n", s)
  23. }
  24. return nil
  25. }

9. and查询

  1. // QueryStudent6 连接查询 select * from stu where age = ? and name = ?
  2. func QueryStudent6(age int, name string) error {
  3. // 过滤条件
  4. filter := bson.M{
  5. // age = ? and name = ?
  6. "$and": []bson.M{
  7. {"age": age},
  8. {"name": name},
  9. },
  10. // age > ? and name = ?
  11. //"$and": []bson.M{
  12. // bson.M{"age": bson.M{"$gt": 20}},
  13. // bson.M{"name": "zhaoliu"},
  14. //},
  15. // age > ? or name = ?
  16. //"$or": []bson.M{
  17. // bson.M{"age": bson.M{"$gt": 20}},
  18. // bson.M{"name": "zhaoliu"},
  19. //},
  20. }
  21. // 查询
  22. res, err := coll.Find(context.TODO(), filter)
  23. if err != nil {
  24. return err
  25. }
  26. fmt.Println("Document Find successfully!")
  27. defer res.Close(context.Background())
  28. var stus []models.Student
  29. if err = res.All(context.Background(), &stus); err != nil {
  30. return err
  31. }
  32. for _, s := range stus {
  33. fmt.Printf("Document found: %+v\n", s)
  34. }
  35. return nil
  36. }


总结

以上就是今天要讲的内容,如何使用go语言操作mongodb,展示了mongodb的部分指令,而mongodb提供的指令远不止这些,在学习的过程中做笔记,以防日后需要使用mongodb会忘记怎么使用,毕竟好记性不如烂笔头。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/639155
推荐阅读
相关标签
  

闽ICP备14008679号