Compare commits

...

4 Commits

Author SHA1 Message Date
orgin
63199bf862 优化mongodbmodule的NextSeq接口 2022-04-01 17:35:13 +08:00
orgin
4d5d45d555 优化mongo模块 2022-04-01 14:06:24 +08:00
orgin
ca48c443cd 优化mongodb模块并新增test示例 2022-03-29 14:23:12 +08:00
orgin
7d40a48a1b 新增mongo官方驱动模块 2022-03-29 09:09:00 +08:00
2 changed files with 321 additions and 0 deletions

View File

@@ -0,0 +1,113 @@
package mongodbmodule
import (
"context"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/x/bsonx"
"time"
)
type MongoModule struct {
client *mongo.Client
maxOperatorTimeOut time.Duration
}
type Session struct {
*mongo.Client
maxOperatorTimeOut time.Duration
}
func (mm *MongoModule) Init(uri string, maxOperatorTimeOut time.Duration) error {
var err error
mm.client, err = mongo.NewClient(options.Client().ApplyURI(uri))
if err != nil {
return err
}
mm.maxOperatorTimeOut = maxOperatorTimeOut
return nil
}
func (mm *MongoModule) Start() error {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := mm.client.Connect(ctx); err != nil {
return err
}
ctxTimeout, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := mm.client.Ping(ctxTimeout, nil); err != nil {
return err
}
return nil
}
func (mm *MongoModule) TakeSession() Session {
return Session{Client: mm.client, maxOperatorTimeOut: mm.maxOperatorTimeOut}
}
func (s *Session) CountDocument(db string, collection string) (int64, error) {
ctxTimeout, cancel := s.GetDefaultContext()
defer cancel()
return s.Database(db).Collection(collection).CountDocuments(ctxTimeout, bson.D{})
}
func (s *Session) NextSeq(db string, collection string, id interface{}) (int, error) {
var res struct {
Seq int
}
ctxTimeout, cancel := s.GetDefaultContext()
defer cancel()
after := options.After
updateOpts := options.FindOneAndUpdateOptions{ReturnDocument: &after}
err := s.Client.Database(db).Collection(collection).FindOneAndUpdate(ctxTimeout, bson.M{"_id": id}, bson.M{"$inc": bson.M{"Seq": 1}},&updateOpts).Decode(&res)
return res.Seq, err
}
//indexKeys[索引][每个索引key字段]
func (s *Session) EnsureIndex(db string, collection string, indexKeys [][]string, bBackground bool,sparse bool) error {
return s.ensureIndex(db, collection, indexKeys, bBackground, false,sparse)
}
//indexKeys[索引][每个索引key字段]
func (s *Session) EnsureUniqueIndex(db string, collection string, indexKeys [][]string, bBackground bool,sparse bool) error {
return s.ensureIndex(db, collection, indexKeys, bBackground, true,sparse)
}
//keys[索引][每个索引key字段]
func (s *Session) ensureIndex(db string, collection string, indexKeys [][]string, bBackground bool, unique bool,sparse bool) error {
var indexes []mongo.IndexModel
for _, keys := range indexKeys {
keysDoc := bsonx.Doc{}
for _, key := range keys {
keysDoc = keysDoc.Append(key, bsonx.Int32(1))
}
options:= options.Index().SetUnique(unique).SetBackground(bBackground)
if sparse == true {
options.SetSparse(true)
}
indexes = append(indexes, mongo.IndexModel{Keys: keysDoc, Options:options })
}
ctxTimeout, cancel := context.WithTimeout(context.Background(), s.maxOperatorTimeOut)
defer cancel()
_, err := s.Database(db).Collection(collection).Indexes().CreateMany(ctxTimeout, indexes)
return err
}
func (s *Session) GetDefaultContext() (context.Context, context.CancelFunc) {
return context.WithTimeout(context.Background(), s.maxOperatorTimeOut)
}
func (s *Session) Collection(db string, collection string) *mongo.Collection {
return s.Database(db).Collection(collection)
}

View File

@@ -0,0 +1,208 @@
package mongodbmodule
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo/options"
"log"
"testing"
"time"
)
type Student struct {
ID primitive.ObjectID `bson:"_id"`
Name string `bson: "name"`
Age int `bson: "age"`
Sid string `bson: "sid"`
Status int `bson: "status"`
MapData map[int64]int64 `bson: "maptest"`
}
type StudentName struct {
Name string `bson: "name"`
}
func Test_Example(t *testing.T) {
//0.初始化模块
var mongoModule MongoModule
err := mongoModule.Init("mongodb://admin:123456@192.168.2.15:27017/?authSource=admin&maxPoolSize=100&maxConnecting=2&connectTimeoutMS=10000&socketTimeoutMS=5000", time.Second*10)
if err != nil {
t.Log(err)
return
}
mongoModule.Start()
//1.创建索引
session := mongoModule.TakeSession()
var IndexKeys [][]string
//分别建立number,name组合索引
var key1 []string
key1 = append(key1, "number", "name")
//keyId为索引
var key2 []string
key2 = append(key2, "KeyId")
IndexKeys = append(IndexKeys, key1, key2)
session.EnsureIndex("testdb", "test2", IndexKeys, true)
//2.插入数据
//插入单行
var s Student
s.ID = primitive.NewObjectID()
s.Age = 35
s.Name = "xxx"
ctx, cancel := session.GetDefaultContext()
ret, err := session.Collection("testdb", "test2").InsertOne(ctx, s)
cancel()
insertId := ret.InsertedID.(primitive.ObjectID)
log.Println(insertId.Hex(), err)
//插入多行
var ss []interface{}
ctx, cancel = session.GetDefaultContext()
for i := 0; i < 3; i++ {
var s Student
s.ID = primitive.NewObjectID()
s.Age = i
s.Name = fmt.Sprintf("name_%d", i)
ss = append(ss, s)
}
manyRet, err := session.Collection("testdb", "test2").InsertMany(ctx, ss)
cancel()
log.Println(manyRet, err)
//3.更新数据
//update
var sUpdate Student
sUpdate.ID, _ = primitive.ObjectIDFromHex("62429c3b32a269dcbe0cdc7b")
sUpdate.Age = 35
sUpdate.Name = "xxxx555555"
//update := bson.M{"$set": bson.M{"age": 35}}
update := bson.M{"$set": sUpdate}
ctx, cancel = session.GetDefaultContext()
objectId, _ := primitive.ObjectIDFromHex("62429c3b32a269dcbe0cdc7b")
updateResult, err := session.Collection("testdb", "test2").UpdateOne(ctx, bson.M{"_id": objectId}, update)
cancel()
log.Println("collection.UpdateOne:", updateResult, err)
//upset
var s_upset Student
s_upset.ID, _ = primitive.ObjectIDFromHex("62429c3b32a269dcbe0cdc7e")
s_upset.Name = "皇商xx"
s_upset.Age = 35099
s_upset.Sid = "Sid22"
s_upset.MapData = make(map[int64]int64)
s_upset.MapData[3434] = 13424234
s_upset.MapData[444] = 656565656
update = bson.M{"$set": s_upset}
updateOpts := options.Update().SetUpsert(true)
ctx, cancel = session.GetDefaultContext()
updateResult, err = session.Collection("testdb", "test2").UpdateOne(ctx, bson.M{"_id": s_upset.ID}, update, updateOpts)
cancel()
if err != nil {
log.Fatal(err)
}
log.Println("collection.UpdateOne:", updateResult)
//4.删除
ctx, cancel = session.GetDefaultContext()
Id, _ := primitive.ObjectIDFromHex("62429aa71b6445d1f5bf9aee")
deleteResult, err := session.Collection("testdb", "test2").DeleteOne(ctx, bson.M{"_id": Id})
cancel()
if err != nil {
log.Fatal(err)
}
log.Println("collection.DeleteOne:", deleteResult)
//5.查询
//查询单条
ctx, cancel = session.GetDefaultContext()
var sel_One Student
Ids, _ := primitive.ObjectIDFromHex("62429b13bbff8acf147ef8d7")
err = session.Collection("testdb", "test2").FindOne(context.Background(), bson.M{"_id": Ids}).Decode(&sel_One)
cancel()
if err != nil {
log.Fatal(err)
}
log.Println("collection.FindOne: ", sel_One)
//查询多条1
ctx, cancel = session.GetDefaultContext()
cur, err := session.Collection("testdb", "test2").Find(ctx, bson.M{})
cancel()
if err != nil {
log.Fatal(err)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
var sSlice []Student
ctx, cancel = session.GetDefaultContext()
err = cur.All(ctx, &sSlice)
if err != nil {
log.Fatal(err)
}
cur.Close(ctx)
cancel()
log.Println("collection.Find curl.All: ", sSlice)
for _, one := range sSlice {
log.Println(one)
}
//查询多条2
cur, err = session.Collection("testdb", "test2").Find(context.Background(), bson.M{})
if err != nil {
log.Fatal(err)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
for cur.Next(context.Background()) {
var s Student
if err = cur.Decode(&s); err != nil {
log.Fatal(err)
}
log.Println("collection.Find cur.Next:", s)
}
cur.Close(context.Background())
//模糊查询
cur, err = session.Collection("testdb", "test2").Find(context.Background(), bson.M{"name": primitive.Regex{Pattern: "xxx"}})
if err != nil {
log.Fatal(err)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
var sSlices []Student
err = cur.All(context.Background(), &sSlices)
if err != nil {
log.Fatal(err)
}
cur.Close(context.Background())
//6.获取数据总行数
count, err := session.Collection("testdb", "test2").CountDocuments(context.Background(), bson.D{})
if err != nil {
log.Fatal(count)
}
log.Println("collection.CountDocuments:", count)
//7.自动序号
Id, _ = primitive.ObjectIDFromHex("62429b13bbff8acf147ef8d7")
for i := 0; i < 10; i++ {
seq, _ := session.NextSeq("testdb", "test2", Id)
log.Println(seq)
}
}