golang操作MongoDB


package main

import (
    "context"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/bson/primitive"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/mongo/readpref"
    "log"
    "time"
)

// 數據結構體
type Test struct {
    Id    string `bson:"_id"`
    Name  string `bson:"name"`
    Level int    `bson:"level"`
}

var db *mongo.Database           // database 話柄
var collection *mongo.Collection // collection 話柄

//1、pool連接池模式
func ConnectToDB(uri, name string, timeout time.Duration) (*mongo.Database, error) {
    // 設置連接超時時間
    ctx, cancel := context.WithTimeout(context.Background(), timeout)
    defer cancel()
    // 通過傳進來的uri連接相關的配置
    o := options.Client().ApplyURI(uri)
    // 發起鏈接
    client, err := mongo.Connect(ctx, o)
    if err != nil {
        log.Fatal(err)
        return nil, err
    }
    // 判斷服務是不是可用
    if err = client.Ping(context.Background(), readpref.Primary()); err != nil {
        log.Fatal(err)
        return nil, err
    }
    // 返回 client
    return client.Database(name), nil
}

//2、新增一條數據
func AddOne(t *Test) {
    objId, err := collection.InsertOne(context.TODO(), &t)
    if err != nil {
        log.Println(err)
        return
    }
    log.Println("錄入數據成功,objId:", objId)
}

//3、刪除一條數據
func Del(m bson.M) {
    deleteResult, err := collection.DeleteOne(context.Background(), m)
    if err != nil {
        log.Fatal(err)
    }
    log.Println("collection.DeleteOne:", deleteResult)
}

//4、編輯一條數據
func EditOne(t *Test, m bson.M) {
    update := bson.M{"$set": t}
    updateResult, err := collection.UpdateOne(context.Background(), m, update)
    if err != nil {
        log.Fatal(err)
    }
    log.Println("collection.UpdateOne:", updateResult)
}

//5、更新數據 - 存在更新,不存在就新增
func Update(t *Test, m bson.M) {
    update := bson.M{"$set": t}
    updateOpts := options.Update().SetUpsert(true)
    updateResult, err := collection.UpdateOne(context.Background(), m, update, updateOpts)
    if err != nil {
        log.Fatal(err)
    }
    log.Println("collection.UpdateOne:", updateResult)
}

//6、模糊查詢
func Sectle(m bson.M) {
    cur, err := collection.Find(context.Background(), m)
    if err != nil {
        log.Fatal(err)
    }
    if err := cur.Err(); err != nil {
        log.Fatal(err)
    }

    for cur.Next(context.Background()) {
        var t Test
        if err = cur.Decode(&t); err != nil {
            log.Fatal(err)
        }
        log.Println("collection.Find name=primitive.Regex{xx}: ", t)
    }
    _ = cur.Close(context.Background())
}

//7、准確搜索一條數據
func GetOne(m bson.M) {
    var one Test
    err := collection.FindOne(context.Background(), m).Decode(&one)
    if err != nil {
        log.Fatal(err)
    }
    log.Println("collection.FindOne: ", one)
}

//8、獲取多條數據
func GetList(m bson.M) {
    cur, err := collection.Find(context.Background(), m)
    if err != nil {
        log.Fatal(err)
    }
    if err := cur.Err(); err != nil {
        log.Fatal(err)
    }
    var all []*Test
    err = cur.All(context.Background(), &all)
    if err != nil {
        log.Fatal(err)
    }
    _ = cur.Close(context.Background())

    log.Println("collection.Find curl.All: ", all)
    for _, one := range all {
        log.Println("Id:", one.Id, " - name:", one.Name, " - level:", one.Level)
    }
}

//9、統計collection的數據總數
func Count() {
    count, err := collection.CountDocuments(context.Background(), bson.D{})
    if err != nil {
        log.Fatal(count)
    }
    log.Println("collection.CountDocuments:", count)
}
func main() {
    uri := "mongodb://admin:123456@10.168.4.61:27017/admin"
    name := "Test"
    maxTime := time.Duration(2) // 鏈接超時時間
    table := "test"             // 表名

    db, err := ConnectToDB(uri, name, maxTime)
    if err != nil {
        panic("鏈接數據庫有誤!")
    }

    collection = db.Collection(table)

    t := Test{
        Id:    "1",
        Name:  "zngw",
        Level: 55,
    }

    // 添加一條數據
    AddOne(&t)

    // EditOne 編輯一條數據
    t.Name = "guoke"
    EditOne(&t, bson.M{"_id": 1})

    // 刪除一條數據
    Del(bson.M{"_id": 1})

    // 更新數據 - 存在更新,不存在就新增
    Update(&t, bson.M{"_id": "1"})

    // Sectle 模糊查詢
    Sectle(bson.M{"name": primitive.Regex{Pattern: "guo"}})

    // 准確搜索一條數據
    GetOne(bson.M{"name": "guoke"})

    // 統計collection的數據總數
    Count()

    // GetList 獲取多條數據
    GetList(bson.M{"level": 55})
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM