Docs 菜单
Docs 主页
/ / /
Go 驱动程序
/ /

连接指南

在此页面上

  • Overview
  • 连接 URI
  • 连接 MongoDB 的其他方式
  • 连接选项

在本指南中,可以了解如何使用 Go Driver 连接到 MongoDB 实例或副本集部署。

您可以使用 Go Driver 连接到以下环境中托管的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

  • MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本

  • MongoDB Community:source-available、免费使用且可自行管理的 MongoDB 版本

连接 URI(也称为连接字符串)可告知驱动程序如何连接到 MongoDB,以及连接后如何进行操作。

以下的例子解释了示例连接 URI 的各个组成部分:

连接字符串的每个部分

在此示例中,我们使用 mongodb 作为协议,它指定了标准连接字符串格式。如果想要获得更高的部署灵活性,并且能够在不重新配置客户端的情况下更改轮换的服务器,也可以使用 DNS 种子列表连接格式

连接字符串的下一部分包含您的数据库用户名,如果使用基于密码的身份验证,则还包含您的密码。将 user 的值替换为您的数据库用户名,将 pass 替换为您的密码。如果您使用的是不需要用户名和密码的身份验证机制,请省略连接 URI 中的这一部分。

连接字符串的下一部分用来指定您 MongoDB 实例的主机名或 IP 地址和端口。在前面的例子中,我们使用 sample.host 作为主机名,27017 作为端口。请将这些值替换为指向您 MongoDB 实例的值。

连接字符串的最后一部分指定了连接和身份验证选项。在此示例中,设置了两个连接选项:maxPoolSize=20w=majority。要了解有关连接选项的更多信息,请阅读本指南的连接选项部分。

要连接到 MongoDB,必须创建一个客户端。客户端可管理您的连接并运行数据库命令。

提示

客户端重用

我们建议您在会话和操作中重复使用客户端。您可以使用同一Client 实例来执行多个任务,而不是每次都创建一个新的。Client 类型可以安全地被多个 goroutine 并发使用。要详细学习;了解连接池在驾驶员中的工作原理,请参阅 常见问题解答页面。

您可以通过将 ClientOptions 对象传递给 Connect() 方法,创建使用连接字符串和其他客户端选项的客户端。

要指定您的连接 URI,请将其传递给 ApplyURI() 方法,该方法会返回一个新的 ClientOptions 实例。要设置任何其他选项,请从 options 包中调用相关辅助方法。

要了解有关连接选项的更多信息,请参阅“连接选项”部分。要了解有关创建客户端的更多信息,请参阅客户端Connect() 的 API 文档。

您可以将 Stable API 版本作为一个选项设置,以避免升级到新的服务器版本时出现破坏性变更 (breaking change)。要了解有关 Stable API 功能的更多信息,请参阅 Stable API 页面

以下代码展示了如何创建使用 Atlas 连接字符串和 Stable API 版本的客户端、如何连接到 MongoDB 以及如何验证连接是否成功:

// Connects to MongoDB and sets a Stable API version
package main
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
// Replace the placeholder with your Atlas connection string
const uri = "<connection string>"
func main() {
// Use the SetServerAPIOptions() method to set the Stable API version to 1
serverAPI := options.ServerAPI(options.ServerAPIVersion1)
opts := options.Client().ApplyURI(uri).SetServerAPIOptions(serverAPI)
// Create a new client and connect to the server
client, err := mongo.Connect(context.TODO(), opts)
if err != nil {
panic(err)
}
defer func() {
if err = client.Disconnect(context.TODO()); err != nil {
panic(err)
}
}()
// Send a ping to confirm a successful connection
var result bson.M
if err := client.Database("admin").RunCommand(context.TODO(), bson.D{{"ping", 1}}).Decode(&result); err != nil {
panic(err)
}
fmt.Println("Pinged your deployment. You successfully connected to MongoDB!")
}

提示

按照快速入门指南检索您的 Atlas 连接字符串。

注意

要了解如何连接到 Atlas Serverless,请参阅“无服务器实例限制”页面,以确定所需的最低驱动程序版本。

如果要连接到未托管在 Atlas 上的单个 MongoDB 服务器实例或副本集,请参阅以下部分了解如何连接。

如果出于开发目的必须在本地计算机上运行 MongoDB Server,请完成以下步骤:

  1. 下载 MongoDB Server CommunityEnterprise 版本。

  2. 安装并配置 MongoDB Server。

  3. 启动该服务器。

重要

务必保护您的 MongoDB 服务器免受恶意攻击。请参阅我们的安全检查清单,获取安全建议清单。

在成功启动 MongoDB 服务器后,在驱动程序连接代码中指定连接字符串。

如果 MongoDB Server 在本地运行,您可以使用连接字符串 "mongodb://localhost:<port>",其中 <port> 是您配置服务器以侦听传入连接的端口号。

如果想要指定其他主机名或 IP 地址,请参阅服务器手册中关于连接字符串的条目。

要测试能否连接到服务器,请在前面的代码示例中将连接字符串替换为 localhost 连接字符串。

MongoDB 副本集部署是一组用于存储相同数据集的连接实例。这种配置提供了数据冗余和高数据可用性。

要连接到副本集部署,请指定每个实例的主机名和端口号(以逗号分隔),并将副本集名称指定为连接字符串中 replicaSet 参数的值。在以下示例中,主机名为 host1host2host3,端口号均为 27017 。副本集名称为 myRS

mongodb://host1:27017,host2:27017,host3:27017/?replicaSet=myRS

连接到副本集时,驱动程序默认执行以下操作:

  • 在给定任一节点的地址时发现所有副本集节点。

  • 将操作分派给相应节点,例如,对主节点进行写入的指令。

提示

您只能指定一台主机来连接到副本集。但是,为了确保指定主机不可用时的连通性,您应该提供完整的主机列表。

要强制在连接 URI 中指定的主机上执行操作,请指定 directConnection 选项。直接连接:

  • 不支持 SRV 字符串。

  • 当指定主机不是主节点时,写入失败。

  • 当指定主机不是节点时,需要指定从节点读取偏好

本部分介绍几个常见的 MongoDB 连接和身份验证选项。可以将连接选项作为连接 URI 的参数传递,以指定客户端的行为。

选项名称
类型
默认值
说明
timeoutMS
整型
null
指定在返回超时错误之前在 Client 上运行的单个操作可以花费的毫秒数。仅当操作的上下文没有截止时间时,操作才会遵循此设置。
connectTimeoutMS
整型
30000
指定 TCP 连接超时之前要等待的毫秒数。
maxPoolSize
整型
100
指定连接池在给定时间内的最大连接数。
replicaSet
字符串
null
指定集群的副本集名称。副本集中的所有节点必须具有相同的副本集名称,否则客户端不会将其视为副本集的一部分。
maxIdleTimeMS
整型
0
指定连接在被删除和关闭之前可以在连接池中保持空闲状态的最长时间。默认值为 0,这意味着连接可以无限期地保持未使用状态。
minPoolSize
整型
0
指定驱动程序在单个连接池中维护的最小连接数。
socketTimeoutMS
整型
0
指定在返回网络错误之前,等待套接字读取或写入返回的毫秒数。默认值为 0,表示没有超时限制。
serverSelectionTimeoutMS
整型
30000
指定找到一个可用且适合执行操作的服务器所允许等待的毫秒数。
heartbeatFrequencyMS
整型
10000
指定周期性后台服务器检查之间所需等待的毫秒数。
TLS
布尔
false
指定是否与实例建立传输层安全 (TLS) 连接。在连接字符串中使用 DNS 种子列表 (SRV) 时,会自动设置为 true。您可以将值设置为 false 来覆盖此行为。
w
字符串或整数
null
指定写关注。要了解有关值的更多信息,请参阅有关写关注选项的服务器文档。
directConnection
布尔
false
指定是否强制将所有操作分派到连接 URI 中指定的主机。

有关连接选项的完整列表,请参阅 ClientOptions API 文档

您可以通过 SetTimeout() 方法或在连接 URI 字符串中指定 timeoutMS 选项,在 Client 上设置一个单独的 Timeout 选项,以控制执行单个操作所需的时间。如果您没有为针对同一实体的操作设置上下文,则代码中其他位置的 DatabaseCollectionSessionChangeStreamBucket 实例将继承 Client 中的 Timeout 选项。

如果您在操作中传递了一个具有截止时间的上下文,驱动程序将使用该上下文的截止时间执行操作。如果上下文没有截止时间,则驱动程序会使用 Client 上设置的 Timeout 选项基于给定上下文派生出新的上下文。

注意

超时规范下的重试

在默认设置下,如果您在 Client 上设置了 Timeout 选项,且您的操作需要重试,则驱动程序会在超时前尽可能多次重试操作。超时后,驱动程序会返回超时错误。Go 驱动程序从 1.1 及更高版本开始,默认启用了可重试的读写操作。有关可重试读取可重试写入的更多信息,请参阅“服务器”手册。

以下代码展示了如何使用 SetTimeout 选项在 Client 上设置 Timeout 选项:

opts := options.Client().SetTimeout(5 * time.Second)

以下示例展示了如何使用 URI 选项设置单个超时并执行继承此设置的操作:

uri := "mongodb://user:pass@sample.host:27017/?timeoutMS=5000"
client := mongo.Connect(context.TODO(), uri)
coll := client.Database("<db>").Collection("<collection>")
...
coll.InsertOne(context.Background(), doc)

重要

旧版中的超时选项

SocketTimeoutwTimeoutMaxTimeMaxCommitTime 将在即将到来的版本中被弃用。如果您设置了 Timeout,驱动程序会忽略 MaxTimeMaxCommitTime。驱动程序仍然遵循所设定的 SocketTimeoutwTimeout,但这些设置可能会导致未定义的行为。考虑只使用单一超时选项。

后退

连接