// @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 只修改指定字段的值,不影响其他值