1、pool 连接池模式

func ConnectToDB(uri, name string, timeout time.Duration) (*mongo.Database, error)  {
	// 设置连接超时时间
	ctx, cancel := context.WithTimeout(context.Background(), timeout)
	defer cancel()
	// 通过传进来的uri连接相关的配置
	o := options.Client().ApplyURI(uri)
	// 发起链接
	client, err := mongo.Connect(ctx, o)
	if err != nil {
		log.Fatal(err)
		return nil, err
	}
	// 判断服务是不是可用
	if err = client.Ping(context.Background(), readpref.Primary()); err != nil {
		log.Fatal(err)
		return nil, err
	}
	// 返回 client
	return client.Database(name), nil
}

2、AddOne 新增一条数据

func AddOne(t *Test)  {
	objId, err := collection.InsertOne(context.TODO(), &t)
	if err != nil {
		log.Println(err)
		return
	}
	log.Println("录入数据成功,objId:",objId)
}

3、删除一条数据

func Del(m bson.M)  {
	deleteResult, err := collection.DeleteOne(context.Background(), m)
	if err != nil {
		log.Fatal(err)
	}
	log.Println("collection.DeleteOne:", deleteResult)
}

4、EditOne 编辑一条数据

func EditOne(t *Test,m bson.M)  {
	update := bson.M{"$set": t}
	updateResult, err := collection.UpdateOne(context.Background(),  m, update)
	if err != nil {
		log.Fatal(err)
	}
	log.Println("collection.UpdateOne:", updateResult)
}

5、更新数据 - 存在更新,不存在就新增

func Update(t *Test,m bson.M)  {
	update := bson.M{"$set": t}
	updateOpts := options.Update().SetUpsert(true)
	updateResult, err := collection.UpdateOne(context.Background(), m, update, updateOpts)
	if err != nil {
		log.Fatal(err)
	}
	log.Println("collection.UpdateOne:", updateResult)
}

6、Sectle 模糊查询

func Sectle(m bson.M)  {
	cur, err := collection.Find(context.Background(), m)
	if err != nil {
		log.Fatal(err)
	}
	if err := cur.Err(); err != nil {
		log.Fatal(err)
	}

	for cur.Next(context.Background()) {
		var t Test
		if err = cur.Decode(&t); err != nil {
			log.Fatal(err)
		}
		log.Println("collection.Find name=primitive.Regex{xx}: ", t)
	}
	_ = cur.Close(context.Background())
}

7、准确搜索一条数据

func GetOne(m bson.M)  {
	var one Test
	err := collection.FindOne(context.Background(), m).Decode(&one)
	if err != nil {
		log.Fatal(err)
	}
	log.Println("collection.FindOne: ", one)
}

8、GetList 获取多条数据

func GetList(m bson.M)  {
	cur, err := collection.Find(context.Background(), m)
	if err != nil {
		log.Fatal(err)
	}
	if err := cur.Err(); err != nil {
		log.Fatal(err)
	}
	var all []*Test
	err = cur.All(context.Background(), &all)
	if err != nil {
		log.Fatal(err)
	}
	_ = cur.Close(context.Background())

	log.Println("collection.Find curl.All: ", all)
	for _, one := range all {
		log.Println("Id:",one.Id," - name:",one.Name," - level:",one.Level)
	}
}

9、统计collection的数据总数

func Count()  {
	count, err := collection.CountDocuments(context.Background(), bson.D{})
	if err != nil {
		log.Fatal(count)
	}
	log.Println("collection.CountDocuments:", count)
}

10、测试

import (
	"context"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"go.mongodb.org/mongo-driver/mongo/readpref"
	"log"
	"time"
)

// 数据结构体
type Test struct {
	Id string `bson:"_id"`
	Name string `bson:"name"`
	Level int `bson:"level"`
}

var db *mongo.Database 				// database 话柄
var collection *mongo.Collection 	// collection 话柄

func main() {
	uri := "mongodb://root:123456@127.0.0.1:27017/admin"
	name := "Test"
	maxTime := time.Duration(2) 	// 链接超时时间
	table := "test" 				// 表名

	db, err := ConnectToDB(uri, name, maxTime)
	if err != nil {
		panic("链接数据库有误!")
	}

	collection = db.Collection(table)

	t := Test{
		Id:    "1",
		Name:  "zngw",
		Level: 55,
	}

	// 添加一条数据
	AddOne(&t)

	// EditOne 编辑一条数据
	t.Name = "guoke"
	EditOne(&t, bson.M{"_id":1})

	// 删除一条数据
	Del(bson.M{"_id":1})

	// 更新数据 - 存在更新,不存在就新增
	Update(&t, bson.M{"_id":"1"})

        // Sectle 模糊查询
	Sectle(bson.M{"name": primitive.Regex{Pattern: "guo"}})

        // 准确搜索一条数据
	GetOne(bson.M{"name":"guoke"})

        // 统计collection的数据总数
	Count()

        // GetList 获取多条数据
	GetList(bson.M{"level":55})
}
2021/09/10 23:39:54 录入数据成功,objId: &{1}
2021/09/10 23:39:54 collection.UpdateOne: &{0 0 0 <nil>}
2021/09/10 23:39:54 collection.DeleteOne: &{0}
2021/09/10 23:39:54 collection.UpdateOne: &{1 1 0 <nil>}
2021/09/10 23:39:54 collection.Find name=primitive.Regex{xx}:  {1 guoke 55}
2021/09/10 23:39:54 collection.FindOne:  {1 guoke 55}
2021/09/10 23:39:54 collection.CountDocuments: 1
2021/09/10 23:39:54 collection.Find curl.All:  [0xc0000a2b40]
2021/09/10 23:39:54 Id: 1  - name: guoke  - level: 55