基本操作


// @Title  数据库的控制逻辑层
// @Description  这里主要是一些操作数据库的逻辑
package database

import (
	"context"
	"errors"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"go.mongodb.org/mongo-driver/mongo/readpref"
	"log"
	"os"
	"time"
	"xblog/internal/web/common"
)

//数据库DB对象
var DB *mongo.Database

//context对象
var ctx = context.Background()

//数据库初始化
func DbInit() {
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel() //养成良好的习惯,在调用WithTimeout之后defer cancel()
	//获取MongoDB数据库配置
	config := common.GetConfig("mongo")
	MongoClient, err := mongo.Connect(ctx, options.Client().ApplyURI(config["url"])) // change the URI when you need
	if err != nil {
		log.Fatal("数据库连接失败!")
		os.Exit(3)
	}
	// 检查连接
	if err = MongoClient.Ping(ctx, readpref.Primary()); err != nil {
		log.Fatal("数据库连接失败!")
		os.Exit(3)
	}
	//选择数据库
	DB = MongoClient.Database(config["name"])
}

//数据库重连函数
func DbReconnect() {
	//获取client对象,并判断是否可用
	if DB != nil {
		MongoClient := DB.Client()
		if err := MongoClient.Ping(ctx, readpref.Primary()); err == nil {
			return
		}
	}
	DbInit()
}

//数据库插入函数(插入一条数据)
func MongoInsertOne(collection string, data interface{}) (*mongo.InsertOneResult, error) {
	//重连数据库
	DbReconnect()
	//获取collection对象
	coll := DB.Collection(collection)
	//把数据转换为bson对象
	bsonData, err := bson.Marshal(data)
	if err != nil {
		return nil, errors.New("bson转换失败")
	}
	//执行插入操作
	return coll.InsertOne(ctx, bsonData)
}

//数据库插入函数(插入多条数据)
func MongoInsertMany(collection string, data []interface{}) (*mongo.InsertManyResult, error) {
	//重连数据库
	DbReconnect()
	//遍历整个接口转换为bson对象
	for i := 0; i < len(data); i++ {
		bsonData, err := bson.Marshal(data[i])
		if err != nil {
			return nil, errors.New("bson转换失败")
		}
		data[i] = bsonData
	}
	//获取collection对象
	coll := DB.Collection(collection)
	//执行插入操作
	return coll.InsertMany(ctx, data)
}

//数据库单个查找函数
func MongoFindOne(collection string, filter bson.M, result interface{}) error {
	//重连数据库
	DbReconnect()
	//获取collection对象
	coll := DB.Collection(collection)
	//查找数据
	res := coll.FindOne(ctx, filter)
	//把获取到的内容传递给接口对象,并返回查找结果
	return res.Decode(result)
}

//数据库查询多个值(传递一个结构体的地址,返回结构体数组)
//转换时可以使用这种方式:v.(*database.User).Nickname
//传递时按照这个方式来 var user database.User
//res,_:=database.MongoFindMore("user",bson.M{"nickname":"测试"},&user)
func MongoFindMore(collection string, filter bson.M, result interface{}) ([]interface{}, error) {
	//把result解析为列表
	var results []interface{}
	//重连数据库
	DbReconnect()
	//获取collection对象
	coll := DB.Collection(collection)
	//获取cursor游标对象
	cursor, err := coll.Find(ctx, filter)
	if err != nil {
		return nil, errors.New("查找数据失败")
	}
	//遍历游标,获取所有数据
	for cursor.Next(ctx) {
		if err := cursor.Decode(result); err != nil {
			return nil, errors.New("数据解析失败")
		}
		//吧获取到的数据加到数组中去
		results = append(results, result)
	}
	//返回results对象
	return results, nil
}

//数据库更改单个值
//参考:res, _ := database.MongoUpdateOne("user",bson.M{"username": "校友"},bson.M{"$set": map[string]string{"nickname":"小游"}})
func MongoUpdateOne(collection string, filter bson.M, update bson.M) (*mongo.UpdateResult, error) {
	//重连数据库
	DbReconnect()
	//获取collection对象
	coll := DB.Collection(collection)
	//更新数据
	return coll.UpdateOne(ctx, filter, update)
}

//数据库更改多个值
func MongoUpdateMore(collection string, filter bson.M, update bson.M) (*mongo.UpdateResult, error) {
	//重连数据库
	DbReconnect()
	//获取collection对象
	coll := DB.Collection(collection)
	//更新数据
	return coll.UpdateMany(ctx, filter, update)
}

//数据库删除单个语句
func MongoDeleteOne(collection string, filter bson.M) (*mongo.DeleteResult, error) {
	//重连数据库
	DbReconnect()
	//获取collection对象
	coll := DB.Collection(collection)
	//更新数据
	return coll.DeleteOne(ctx, filter)
}

//数据库删除多个语句
func MongoDeleteMore(collection string, filter bson.M) (*mongo.DeleteResult, error) {
	//重连数据库
	DbReconnect()
	//获取collection对象
	coll := DB.Collection(collection)
	//更新数据
	return coll.DeleteMany(ctx, filter)
}

注意:$set 只修改指定字段的值,不影响其他值


文章作者: 小游
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小游 !
  目录