Golang MongoDB扩展包之连接...

胡大大 2020-07-29 16:58:23 116 0 comments

前言

本篇文章主要是针对Golang MongoDB客户端的一个使用教程,客户端使用的MongoDB官方Golang扩展包。

术语

  • bson.D
    bson文档。这种类型应该在顺序很重要的情况下使用,比如MongoDB命令。
  • bson.M
    一个无序的Map。它和D是一样的,除了它不保持顺序。
  • bson.A
    表示一个bson数组
  • bson.E
    D中的单个元素。

快速开始

开始之前,你可以在这里找到本文的所有代码示例:mongo-go-example
在运行示例代码之前,请确保你的电脑安装了docker,本文的MongoDB运行环境基于docker,如果安装了docker,在项目根目录执行docker-compose up -d即可运行MongoDB,如果没有安装docker,也可以申请MongoDB官方的免费版本云服务,教程在这里:免费试用MongoDB

安装

在GoPath以外的目录新建一个目录,然后执行以下命令:

go mod init mongoproject go get go.mongodb.org/mongo-driver

连接到MongoDB

package main import ( "context" "fmt" "log" "time" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/mongo/readpref" ) func main() { clientOpts := options.Client().ApplyURI("mongodb://test:test@127.0.0.1:27017") client, err := mongo.Connect(context.TODO(), clientOpts) if err != nil { log.Fatal(err) } _ = client }

注意:上面的代码并不会真正的连接MongoDB,只是初始化了一个client,如果要检查MongoDB是否真正的连接上,必须要加上Ping方法。

完善后代码如下:

func getClient() *mongo.Client { clientOption := options.Client() clientOption.ApplyURI("mongodb://test:test@127.0.0.1:27017") client, err := mongo.NewClient(clientOption) if err != nil { log.Fatal(err) } ctx, _ := context.WithTimeout(context.Background(), 10*time.Second) err = client.Connect(ctx) if err != nil { log.Fatal(err) } err = client.Ping(ctx, readpref.Primary()) if err != nil { log.Fatal(err) } return client }

上面的代码就能正确的连接MongoDB,当然这只是连接MongoDB的方式之一,其他连接方式请参考:Connect
接下来我们来验证下是否连接成功:

func main() { ctx := context.Background() client := getClient() defer client.Disconnect(ctx) res, err := client.ListDatabases(ctx, bson.M{}) if err != nil { log.Fatalln() } for _, database := range res.Databases { log.Println(database.Name) } }

控制台执行go run main.go成功打印出了MongoDB自带的三个数据库。
image.png
除此之外,还有一些地方需要注意:
1.上面的clientOption有一系列设置MongoDB客户端设置的方法,虽然默认的设置在开发环境够用了,但是到生产环境还是要根据自己的业务来调整配置,让客户端的性能更好,我简单列几个方法:

  • SetConnectTimeout
    SetConnectTimeout指定用于创建到服务器的连接的超时。如果一个自定义拨号器被指定通过SetDialer,这个选项不能被使用。这可以通过ApplyURI的“connectTimeoutMS”来设置。g“connectTimeoutMS = 30”)选项。如果设置为0,则不会使用超时。默认值是30秒。
  • SetMaxPoolSize
    SetMaxPoolSize指定驱动程序的连接池中允许连接到每个服务器的最大连接数。如果达到这个最大值,对服务器的请求将阻塞。这也可以通过“maxPoolSize”URI选项来设置。“maxPoolSize = 100”)。默认值是100。如果这个值为0,它将被设置为math.MaxInt64。
  • SetReplicaSet
    SetReplicaSet指定集群的副本集名称。如果指定了,集群将被视为一个副本集,驱动程序将自动发现集中的所有服务器,从通过ApplyURI或SetHosts指定的节点开始。复制集中的所有节点必须具有相同的复制集名称,否则客户端将不会将它们视为该集合的一部分。这也可以通过“replicaSet”URI选项来设置。“replicaSet = replset”)。默认值为空。如果您想使用事务,则需要此选项。
  • SetServerSelectionTimeout
    SetServerSelectionTimeout指定驱动程序需要等待多长时间才能找到可用的、合适的服务器来执行操作。这也可以通过“serverSelectionTimeoutMS”URI选项来设置。“serverSelectionTimeoutMS = 30000”)。默认值是30秒。

上面只是我简单了列了几个方法示例,更多方法设置请参考这里:ClientOptions,你可以根据自己的业务来设置。
例如下面这样:

clientOption := options.Client() clientOption.ApplyURI("mongodb://test:test@127.0.0.1:27017") clientOption.SetConnectTimeout(time.Second * 10) clientOption.SetServerSelectionTimeout(time.Second * 60) clientOption.SetSocketTimeout(time.Second * 30) clientOption.SetMaxPoolSize(10) clientOption.SetMinPoolSize(1) clientOption.SetMaxConnIdleTime(time.Second * 30) //clientOption.SetReplicaSet("rs0") client, err := mongo.NewClient(clientOption) if err != nil { log.Fatal(err) } ctx, _ := context.WithTimeout(context.Background(), 10*time.Second) err = client.Connect(ctx) if err != nil { log.Fatal(err) } err = client.Ping(ctx, readpref.Primary()) if err != nil { log.Fatal(err) }

ok,这篇文章就到这里,下篇文章讲解MongoDB的增删改查操作。
转载请注明出处,谢谢。



标签
评论一下

评论列表

暂时没有评论,快来评论吧..