You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
368 lines
8.0 KiB
368 lines
8.0 KiB
package mongo
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
"log"
|
|
"matchmaking-system/internal/conf"
|
|
)
|
|
|
|
// NewMongodb
|
|
//
|
|
// @Description:
|
|
// @param c
|
|
// @return *mongo.Client
|
|
func NewMongodb(c *conf.Data) *mongo.Client {
|
|
mongodb := c.Mongodb.Db
|
|
urlStr := fmt.Sprintf("mongodb://%v:%v@%v/%v?ssl=false&authSource=admin", c.Mongodb.User, c.Mongodb.Password, c.Mongodb.Addr, mongodb)
|
|
clientOptions := options.Client().ApplyURI(urlStr)
|
|
client, err := mongo.Connect(context.TODO(), clientOptions)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
// Check the connection
|
|
err = client.Ping(context.TODO(), nil)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return &mongo.Client{}
|
|
}
|
|
|
|
// mgoConnect
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @return *mongo.Collection
|
|
func mgoConnect(mgoDb *mongo.Client, DataBase string, collection string) *mongo.Collection {
|
|
return mgoDb.Database(DataBase).Collection(collection)
|
|
}
|
|
|
|
// MgoConnect
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @return *mongo.Collection
|
|
func MgoConnect(mgoDb *mongo.Client, DataBase string, collection string) *mongo.Collection {
|
|
return mgoConnect(mgoDb, DataBase, collection)
|
|
}
|
|
|
|
// MgoInsertOne
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param docs
|
|
// @return error
|
|
func MgoInsertOne(mgoDb *mongo.Client, DataBase string, collection string, docs interface{}) error {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
if _, err := c.InsertOne(context.TODO(), docs); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// MgoInsertMany
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param docs
|
|
// @return error
|
|
func MgoInsertMany(mgoDb *mongo.Client, DataBase string, collection string, docs []interface{}) error {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
if _, err := c.InsertMany(context.TODO(), docs); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// MgoUpdateID
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param id
|
|
// @param update
|
|
// @return error
|
|
func MgoUpdateID(mgoDb *mongo.Client, DataBase string, collection string, id interface{}, update interface{}) error {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
if _, err := c.UpdateByID(context.TODO(), id, update); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// MgoUpdateOne
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param filter
|
|
// @param update
|
|
// @return error
|
|
func MgoUpdateOne(mgoDb *mongo.Client, DataBase string, collection string, filter interface{}, update interface{}) error {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
if _, err := c.UpdateOne(context.TODO(), filter, update); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// MgoUpdateMany
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param filter
|
|
// @param update
|
|
// @return error
|
|
func MgoUpdateMany(mgoDb *mongo.Client, DataBase string, collection string, filter interface{}, update []interface{}) error {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
if _, err := c.UpdateMany(context.TODO(), filter, update); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// MgoBulkWrite
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param models
|
|
// @return error
|
|
func MgoBulkWrite(mgoDb *mongo.Client, DataBase string, collection string, models []mongo.WriteModel) error {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
_, err := c.BulkWrite(context.TODO(), models)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
// MgoIsExist
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param filter
|
|
// @return bool
|
|
func MgoIsExist(mgoDb *mongo.Client, DataBase string, collection string, filter interface{}) bool {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
cur, err := c.Find(context.TODO(), filter)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
|
|
var numDocs int
|
|
for cur.Next(context.Background()) {
|
|
numDocs++
|
|
}
|
|
|
|
return numDocs > 0
|
|
}
|
|
|
|
// MgoFind
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param filter
|
|
// @return interface{}
|
|
// @return error
|
|
func MgoFind(mgoDb *mongo.Client, DataBase string, collection string, filter interface{}) (interface{}, error) {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
cursor, err := c.Find(context.TODO(), filter)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var results []bson.M
|
|
if err = cursor.All(context.TODO(), &results); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
return results, nil
|
|
}
|
|
|
|
// MgoFindOne
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param filter
|
|
// @return bson.D
|
|
// @return error
|
|
func MgoFindOne(mgoDb *mongo.Client, DataBase string, collection string, filter interface{}) (bson.D, error) {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
cur := c.FindOne(context.TODO(), filter)
|
|
var res bson.D
|
|
if err := cur.Decode(&res); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return res, nil
|
|
}
|
|
|
|
// MgoFindAll
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param filter
|
|
// @return interface{}
|
|
// @return error
|
|
func MgoFindAll(mgoDb *mongo.Client, DataBase string, collection string, filter interface{}) (interface{}, error) {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
cur, err := c.Find(context.TODO(), filter)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var res interface{}
|
|
if err := cur.All(context.TODO(), &res); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return res, err
|
|
}
|
|
|
|
// MgoDeleteOne
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param filter
|
|
// @return error
|
|
func MgoDeleteOne(mgoDb *mongo.Client, DataBase string, collection string, filter interface{}) error {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
_, err := c.DeleteOne(context.TODO(), filter)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// MgoDeleteMany
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param filter
|
|
// @return error
|
|
func MgoDeleteMany(mgoDb *mongo.Client, DataBase string, collection string, filter interface{}) error {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
_, err := c.DeleteMany(context.TODO(), filter)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// MgoPagingFind
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param filter
|
|
// @param limit
|
|
// @param page
|
|
// @param sort
|
|
// @return []bson.M
|
|
// @return error
|
|
func MgoPagingFind(mgoDb *mongo.Client, DataBase string, collection string, filter interface{}, limit, page int64, sort int) ([]bson.M, error) {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
|
|
var optionStr *options.FindOptions
|
|
if sort != 0 {
|
|
optionStr = options.Find().SetLimit(limit).SetSkip((limit * page) - limit).SetSort(bson.M{"Code": sort})
|
|
} else {
|
|
optionStr = options.Find().SetLimit(limit).SetSkip((limit * page) - limit)
|
|
}
|
|
|
|
cur, err := c.Find(context.Background(), filter, optionStr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var results []bson.M
|
|
if err = cur.All(context.TODO(), &results); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
return results, err
|
|
}
|
|
|
|
// MgoFindTotal
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param filter
|
|
// @return int64
|
|
// @return error
|
|
func MgoFindTotal(mgoDb *mongo.Client, DataBase string, collection string, filter interface{}) (int64, error) {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
|
|
total, err := c.CountDocuments(context.TODO(), filter)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return total, nil
|
|
}
|
|
|
|
// MgoAggregate
|
|
//
|
|
// @Description:
|
|
// @param mgoDb
|
|
// @param DataBase
|
|
// @param collection
|
|
// @param filter
|
|
// @return interface{}
|
|
// @return error
|
|
func MgoAggregate(mgoDb *mongo.Client, DataBase string, collection string, filter mongo.Pipeline) (interface{}, error) {
|
|
c := mgoConnect(mgoDb, DataBase, collection)
|
|
|
|
aggregate, err := c.Aggregate(context.TODO(), filter)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
var showsWithInfo []map[string]interface{}
|
|
if err = aggregate.All(context.TODO(), &showsWithInfo); err != nil {
|
|
log.Printf("collection %s", err)
|
|
panic(err)
|
|
}
|
|
|
|
return showsWithInfo, nil
|
|
}
|
|
|