第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Go 中重用 MongoDB 連接

如何在 Go 中重用 MongoDB 連接

Go
慕容3067478 2023-07-31 10:58:27
我想將用 Go 編寫的服務(wù)器與 MongoDB 連接,但我不知道如何以有效的方式做到這一點。我發(fā)現(xiàn)幾個例子實現(xiàn)了它,如下所示。庫/mongodb/client.gopackage mongodbimport (    "context"    "log"    "project/keys"    "go.mongodb.org/mongo-driver/mongo"    "go.mongodb.org/mongo-driver/mongo/options")func GetClient() *mongo.Database {    client, err := mongo.Connect(        context.Background(),        options.Client().ApplyURI(keys.GetKeys().MONGO_URI),    )    if err != nil {        log.Fatal(err)    }    return client.Database(keys.GetKeys().MONGO_DB_NAME)}服務(wù)/用戶/findOne.gopackage userservicesimport (    "context"    "log"    "project/libs/mongodb"    "project/models"    "go.mongodb.org/mongo-driver/bson")func FindOne(filter bson.M) (models.User, error) {    var user models.User    collection := mongodb.GetClient().Collection("users")    result := collection.FindOne(context.TODO(), filter)    if result.Err() != nil {        return user, result.Err()    }    if err := result.Decode(&user); err != nil {        log.Println("Failed to decode user with error:", err)        return user, err    }    return user, nil}該GetClient函數(shù)返回一個數(shù)據(jù)庫實例,然后在整個應(yīng)用程序中使用該實例。這似乎有效,但我想知道這是否真的是最佳實踐,因為每次請求新客戶端時似乎都會創(chuàng)建一個新連接,如第二個代碼片段所示,或者該假設(shè)是否不正確?我還考慮過轉(zhuǎn)換GetClient為單例,它總是返回相同的數(shù)據(jù)庫實例,但在這種情況下如何處理丟失的連接?謝謝
查看完整描述

3 回答

?
牛魔王的故事

TA貢獻1830條經(jīng)驗 獲得超3個贊

我就是這樣做的。在服務(wù)啟動時執(zhí)行一次,然后將 MongoDatastore 對象傳遞給編排器、服務(wù)層和存儲庫層。我正在使用 mongo 的“github.com/mongodb/mongo-go-driver/mongo”驅(qū)動程序。我認為它在內(nèi)部監(jiān)視并回收空閑連接。因此,只要對 mongo.Client 對象的引用不丟失,我們就不必擔(dān)心連接中斷。



const CONNECTED = "Successfully connected to database: %v"


type MongoDatastore struct {

    db      *mongo.Database

    Session *mongo.Client

    logger  *logrus.Logger

}


func NewDatastore(config config.GeneralConfig, logger *logrus.Logger) *MongoDatastore {


    var mongoDataStore *MongoDatastore

    db, session := connect(config, logger)

    if db != nil && session != nil {


        // log statements here as well


        mongoDataStore = new(MongoDatastore)

        mongoDataStore.db = db

        mongoDataStore.logger = logger

        mongoDataStore.Session = session

        return mongoDataStore

    }


    logger.Fatalf("Failed to connect to database: %v", config.DatabaseName)


    return nil

}


func connect(generalConfig config.GeneralConfig, logger *logrus.Logger) (a *mongo.Database, b *mongo.Client) {

    var connectOnce sync.Once

    var db *mongo.Database

    var session *mongo.Client

    connectOnce.Do(func() {

        db, session = connectToMongo(generalConfig, logger)

    })


    return db, session

}


func connectToMongo(generalConfig config.GeneralConfig, logger *logrus.Logger) (a *mongo.Database, b *mongo.Client) {


    var err error

    session, err := mongo.NewClient(generalConfig.DatabaseHost)

    if err != nil {

        logger.Fatal(err)

    }

    session.Connect(context.TODO())

    if err != nil {

        logger.Fatal(err)

    }


    var DB = session.Database(generalConfig.DatabaseName)

    logger.Info(CONNECTED, generalConfig.DatabaseName)


    return DB, session

}


您現(xiàn)在可以按如下方式創(chuàng)建存儲庫:-


type TestRepository interface{

    Find(ctx context.Context, filters interface{}) []Document, error

}


type testRepository struct {

    store      *datastore.MongoDatastore

}


func (r *testRepository) Find(ctx context.Context , filters interface{}) []Document, error{

    cur, err := r.store.GetCollection("some_collection_name").Find(ctx, filters)

    if err != nil {

        return nil, err

    }

    defer cur.Close(ctx)

    var result = make([]models.Document, 0)

    for cur.Next(ctx) {

        var currDoc models.Document

        err := cur.Decode(&currDoc)

        if err != nil {

            //log here

            continue

        }

        result = append(result, currDoc)

    }

    return result, err

}


查看完整回答
反對 回復(fù) 2023-07-31
?
人到中年有點甜

TA貢獻1895條經(jīng)驗 獲得超7個贊

我這樣做解決了它


var CNX = Connection()

func Connection() *mongo.Client {

    // Set client options

    clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")


    // Connect to MongoDB

    client, err := mongo.Connect(context.TODO(), clientOptions)


    if err != nil {

        log.Fatal(err)

    }


    // Check the connection

    err = client.Ping(context.TODO(), nil)


    if err != nil {

    log.Fatal(err)

    }


    fmt.Println("Connected to MongoDB!")


    return client

  }


//calll connection

 func main() {

      collection := db.CNX.Database("tasks").Collection("task")

 }


output "Connected to MongoDB!"


查看完整回答
反對 回復(fù) 2023-07-31
?
慕田峪4524236

TA貢獻1875條經(jīng)驗 獲得超5個贊

我所做的是這樣的:


我有一個app.go文件來在我創(chuàng)建的config文件夾中建立mongoDB 連接


func Connection() *mongo.Client {

if err := godotenv.Load(); err != nil {

    log.Println("No .env file found")

}

uri := os.Getenv("MONGODB_URI")

if uri == "" {

    log.Fatal("You must set your 'MONGODB_URI' environmental variable. See\n\t https://www.mongodb.com/docs/drivers/go/current/usage-examples/#environment-variable")

}

// Set client options

clientOptions := options.Client().ApplyURI(uri)


// Connect to MongoDB

client, err := mongo.Connect(context.TODO(), clientOptions)


if err != nil {

    log.Fatal(err)

}


// Check the connection

err = client.Ping(context.TODO(), nil)


if err != nil {

    log.Fatal(err)

}


fmt.Println("Connected to MongoDB!")


return client

}

我在另一個名為employee.go的文件中調(diào)用了這個函數(shù),該文件位于模型文件夾中


var CNX = config.Connection()


func (e *Employee) CreateEmployeeDetails() *Employee {

    coll := CNX.Database("employee").Collection("detail")

    fmt.Println(coll)

    result, err := coll.InsertOne(context.TODO(), e)

    fmt.Printf("Inserted document with _id: %v\n", result.InsertedID)

    if err != nil {

        panic(err)

    }


    return e

}



查看完整回答
反對 回復(fù) 2023-07-31
  • 3 回答
  • 0 關(guān)注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號