mongo.go 6.12 KB
package db

import (
	"context"
	"fmt"
	"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"
	"go.mongodb.org/mongo-driver/x/bsonx"
	"pro2d/conf"
	"strconv"
	"time"
)
type Database struct {
	Mongo  *mongo.Database
}

//初始化
func (db *Database)Connect(conf *conf.MongoConf) error {
	var uri string
	if conf.User!= "" {
		uri = fmt.Sprintf("mongodb://%s:%s@%s:%d/%s?w=majority", conf.User, conf.Password, conf.Host, conf.Port, conf.DBName)
	}else {
		uri = fmt.Sprintf("mongodb://%s:%d/%s?w=majority", conf.Host, conf.Port, conf.DBName)
	}
	// 设置连接超时时间
	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(conf.TimeOut))
	defer cancel()
	// 通过传进来的uri连接相关的配置
	o := options.Client().ApplyURI(uri)
	// 设置最大连接数 - 默认是100 ,不设置就是最大 max 64
	o.SetMaxPoolSize(uint64(conf.MaxNum))
	// 发起链接
	client, err := mongo.Connect(ctx, o)
	if err != nil {
		fmt.Println("ConnectToDB", err)
		return err
	}
	// 判断服务是不是可用
	if err = client.Ping(context.Background(), readpref.Primary()); err != nil {
		fmt.Println("ConnectToDB", err)
		return err
	}

	db.Mongo = client.Database(conf.DBName)
	return nil
}

type MgoPool struct {
	mgo *mongo.Database

	collection string
}

func GetBsonD(key string, value interface{}) interface{} {
	return bson.D{ {key, value}}
}
func GetBsonM(key string, value interface{}) interface{}  {
	return bson.M{key: value}
}

func NewMongoPool(mgo *Database, collection string)*MgoPool {
	return &MgoPool{
		mgo:        mgo.Mongo,
		collection: collection,
	}
}

func (m *MgoPool)SetDatabase(databases string)  {
	//m.db = databases
}
func (m *MgoPool)SetCollect(coll string)  {
	m.collection = coll
}


//func  (m *MgoPool)Insert(coll string, buffer interface{}) error {
//	_, err := m.mgo.Collection(coll).InsertOne(context.TODO(), buffer)
//	if err != nil {
//		fmt.Println(err)
//	}
//	return err
//}

//func (m *MgoPool)FindOne(coll string, filter interface{}) (interface{}, error){
//	findOptions := options.FindOne()
//	cur := m.MongoDBClient.Collection(coll).FindOne(context.TODO(), filter, findOptions)
//	var role interface{}
//	if err := cur.Decode(role); err != nil {
//		return nil, err
//	}
//	return role, nil
//}
// 查询单个
func (m *MgoPool) FindOneKV(key string, value interface{}) *mongo.SingleResult {
	collection := m.mgo.Collection(m.collection)
	//collection.
	filter := bson.D{ {key, value}}
	singleResult := collection.FindOne(context.TODO(), filter)
	return singleResult
}

func (m *MgoPool) FindOne(pri interface{}) *mongo.SingleResult {
	collection := m.mgo.Collection(m.collection)
	//collection.
	singleResult := collection.FindOne(context.TODO(), pri)
	return singleResult
}

//插入单个
func (m *MgoPool) InsertOne(value interface{}) *mongo.InsertOneResult {
	collection := m.mgo.Collection(m.collection)
	insertResult, err := collection.InsertOne(context.TODO(), value)
	if err != nil {
		fmt.Println(err)
	}
	return insertResult
}

//查询集合里有多少数据
func (m *MgoPool) CollectionCount() (string, int64) {
	collection := m.mgo.Collection(m.collection)
	name := collection.Name()
	size, _ := collection.EstimatedDocumentCount(context.TODO())
	return name, size
}

//按选项查询集合 Skip 跳过 Limit 读取数量 sort 1 ,-1 . 1 为最初时间读取 , -1 为最新时间读取
func (m *MgoPool) CollectionDocuments(Skip, Limit int64, sort int) *mongo.Cursor {
	collection := m.mgo.Collection(m.collection)
	SORT := bson.D{
		{"_id", sort}} //filter := bson.D{ {key,value}}
	filter := bson.D{
	{}}
	findOptions := options.Find().SetSort(SORT).SetLimit(Limit).SetSkip(Skip)
	//findOptions.SetLimit(i)
	temp, _ := collection.Find(context.Background(), filter, findOptions)
	return temp
}

//获取集合创建时间和编号
func (m *MgoPool) ParsingId(result string) (time.Time, uint64) {
	temp1 := result[:8]
	timestamp, _ := strconv.ParseInt(temp1, 16, 64)
	dateTime := time.Unix(timestamp, 0) //这是截获情报时间 时间格式 2019-04-24 09:23:39 +0800 CST
	temp2 := result[18:]
	count, _ := strconv.ParseUint(temp2, 16, 64) //截获情报的编号
	return dateTime, count
}

//删除文章和查询文章
func (m *MgoPool) DeleteAndFind(key string, value interface{}) (int64, *mongo.SingleResult) {
	collection := m.mgo.Collection(m.collection)
	filter := bson.D{
		{key, value}}
	singleResult := collection.FindOne(context.TODO(), filter)
	DeleteResult, err := collection.DeleteOne(context.TODO(), filter, nil)
	if err != nil {
		fmt.Println("删除时出现错误,你删不掉的~")
	}
	return DeleteResult.DeletedCount, singleResult
}

//删除文章
func (m *MgoPool) Delete(key string, value interface{}) int64 {
	collection := m.mgo.Collection(m.collection)
	filter := bson.D{ {key, value}}
	count, err := collection.DeleteOne(context.TODO(), filter, nil)
	if err != nil {
		fmt.Println(err)
	}
	return count.DeletedCount

}

//删除多个
func (m *MgoPool) DeleteMany(key string, value interface{}) int64 {
	collection := m.mgo.Collection(m.collection)
	filter := bson.D{ {key, value}}

	count, err := collection.DeleteMany(context.TODO(), filter)
	if err != nil {
		fmt.Println(err)
	}
	return count.DeletedCount
}

//索引
func (m *MgoPool) Index(key string){
	collection := m.mgo.Collection(m.collection)
	collection.Indexes().CreateOne(
		context.Background(),
		mongo.IndexModel{
			Keys   : bsonx.Doc{{key, bsonx.Int32(1)}},
			Options: options.Index().SetUnique(true),
		},
	)
}

//更新&保存
func (m *MgoPool) FindOneAndUpdate(filter interface{}, update interface{})*mongo.SingleResult {
	//filter := bson.M{"name": "x", "array.name": "b"}
	//update := bson.M{"array.$[item].detail": "test"}

	collection := m.mgo.Collection(m.collection)
	res := collection.FindOneAndUpdate(context.Background(),
		filter,
		bson.M{"$set": update})
	if res.Err() != nil {
		return nil
	}
	return res
}

func (m *MgoPool) UpdateOne(filter interface{}, update interface{})*mongo.UpdateResult {
	collection := m.mgo.Collection(m.collection)
	res, err := collection.UpdateOne(context.TODO(), filter, update)
	if err != nil {
		return nil
	}

	return res
}