我想将我用Go编写的服务器与MongoDB连接,但我不确定如何以有效的方式完成。我发现的几个例子实现了它,如下所示。
libs/mongodb/client.go
package mongodb
import (
"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)
}
字符串
services/user/findOne.go
package userservices
import (
"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
函数返回一个数据库示例,然后在整个应用程序中使用该示例。这似乎是可行的,但我想知道这是否真的是最佳实践,因为它似乎每次请求新客户端时都会创建一个新连接,如第二个代码片段所示,或者这种假设是不正确的?我还考虑过将GetClient
转换为单例,它总是返回相同的数据库示例,但在这种情况下如何处理丢失的连接?谢谢你的好意
3条答案
按热度按时间igsr9ssn1#
我这样做。在服务启动时执行一次,然后将MongoDatastore对象传递给编排器、服务层和存储库层。我正在使用mongo的“github.com/mongodb/mongo-go-driver/mongo”驱动程序。我认为它内部监控和回收空闲连接。因此,只要对mongo.Client对象的引用没有丢失,我们就不必担心连接断开。
字符串
您现在可以创建您的存储库如下:-
型
mo49yndu2#
我用这个解决了
字符串
8i9zcol23#
我所做的是这样的:
我在创建的config文件夹中有一个app.go文件,用于建立mongoDB连接
字符串
我在另一个名为employee.go的文件中调用了这个函数,该文件位于model文件夹中
型