Overview
在本指南中,可以了解如何使用 Go Driver 连接到 MongoDB 实例或副本集部署。
您可以使用 Go Driver 连接到以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅、自管理的 MongoDB 版本
MongoDB Community:source-available、免费使用且可自管理的 MongoDB 版本
连接 URI
连接 URI(也称为连接字符串)可告知驱动程序如何连接到 MongoDB,以及连接后如何进行操作。
一个连接 URI 的组成部分
以下的例子解释了示例连接 URI 的各个组成部分:

在本例中,我们使用 mongodb 作为协议指定 标准连接字符串格式。如果想要获得更高的部署灵活性,并且能够在不重新配置客户端的情况下更改轮换的服务器,也可以使用 DNS 种子列表连接格式。
连接字符串的下一部分包含您的数据库用户名,如果使用基于密码的身份验证,则还包含您的密码。将 user 的值替换为您的数据库用户名,将 pass 替换为您的密码。如果您使用的是不需要用户名和密码的身份验证机制,请省略连接 URI 中的这一部分。
连接字符串的下一部分用来指定您 MongoDB 实例的主机名或 IP 地址和端口。在前面的例子中,我们使用 sample.host 作为主机名,27017 作为端口。请将这些值替换为指向您 MongoDB 实例的值。
连接字符串的最后一部分指定了连接和身份验证选项。在此示例中,设置了两个连接选项:maxPoolSize=20 和 w=majority。要了解有关连接选项的更多信息,请阅读本指南的连接选项部分。
连接示例
要连接到 MongoDB,必须创建一个客户端。客户端可管理您的连接并运行数据库命令。
提示
客户端重用
我们建议您在会话和操作中重用您的客户端。您可以使用同一 Client 实例来执行多项任务,而不是每次都创建一个新实例。Client 类型可以安全地被多个 goroutine 并发使用。如要详细了解连接池在驱动程序中的工作原理,请参阅常见问题解答页面。
您可以通过将 ClientOptions 对象传递给 Connect() 方法,创建使用连接字符串和其他客户端选项的客户端。
要指定您的连接 URI,请将其传递给 ApplyURI() 方法,该方法会返回一个新的 ClientOptions 实例。要设置任何其他选项,请从 options 包中调用相关辅助方法。
要了解有关连接选项的更多信息,请参阅“连接选项”部分。要了解有关创建客户端的更多信息,请参阅 API 文档中的客户端和 Connect()。
您可以将 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 连接字符串。
连接 MongoDB 的其他方式
如果要连接到未托管在 Atlas 上的单个 MongoDB 服务器实例或副本集,请参阅以下部分了解如何连接。
连接到本地计算机上的 MongoDB Server
如果出于开发目的必须在本地计算机上运行 MongoDB Server,请完成以下步骤:
下载 MongoDB Server Community 或 Enterprise 版本。
安装并配置 MongoDB Server。
启动该服务器。
重要
务必保护您的 MongoDB 服务器免受恶意攻击。请参阅我们的安全检查清单,获取安全建议清单。
在成功启动 MongoDB 服务器后,在驱动程序连接代码中指定连接字符串。
如果 MongoDB Server 在本地运行,您可以使用连接字符串 "mongodb://localhost:<port>",其中 <port> 是您配置服务器以侦听传入连接的端口号。
如果想要指定其他主机名或 IP 地址,请参阅服务器手册中关于连接字符串的条目。
要测试能否连接到服务器,请在前面的代码示例中将连接字符串替换为 localhost 连接字符串。
连接到副本集
MongoDB 副本集部署是一组用于存储相同数据集的连接实例。这种配置提供了数据冗余和高数据可用性。
要连接到副本集部署,请指定每个实例的主机名和端口号(以逗号分隔),并将副本集名称指定为连接字符串中 replicaSet 参数的值。在以下示例中,主机名为 host1、host2 和 host3,端口号均为 27017 。副本集名称为 myRS 。
mongodb://host1:27017,host2:27017,host3:27017/?replicaSet=myRS
连接到副本集时,驱动程序默认执行以下操作:
在给定任一节点的地址时发现所有副本集节点。
将操作分派给相应节点,例如,对主节点进行写入的指令。
提示
您只能指定一台主机来连接到副本集。但是,为了确保指定主机不可用时的连通性,您应该提供完整的主机列表。
DirectConnection
要强制在连接 URI 中指定的主机上执行操作,请指定 directConnection 选项。直接连接:
不支持 SRV 字符串。
当指定主机不是主节点时,写入失败。
Require you to specify a secondary read preference when the specified host isn't the primary.
注意
Docker 中的副本集
当副本集在Docker中运行时,它可能只公开一个MongoDB端点。在这种情况下,无法发现副本集。在连接 URI 中指定 directConnection=false 或未设置此选项,可能会阻止应用程序与之连接。
在测试或开发环境中,您可以通过指定 directConnection=true 来连接到副本集。在生产环境中,我们建议配置集群,以便每个 MongoDB 实例都可以在 Docker 虚拟网络之外访问。
连接选项
本部分介绍几个常见的 MongoDB 连接和身份验证选项。可以将连接选项作为连接 URI 的参数传递,以指定客户端的行为。
选项名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
timeoutMS | 整型 |
| 指定在返回超时错误之前在 |
connectTimeoutMS | 整型 |
| 指定 TCP 连接超时之前要等待的毫秒数。 |
maxPoolSize | 整型 |
| 指定连接池在给定时间内的最大连接数。 |
replicaSet | 字符串 |
| 指定集群的副本集名称。副本集中的所有节点必须具有相同的副本集名称,否则客户端不会将其视为副本集的一部分。 |
maxIdleTimeMS | 整型 |
| 指定连接在被删除和关闭之前可以在连接池中保持空闲状态的最长时间。默认值为 |
minPoolSize | 整型 |
| 指定驱动程序在单个连接池中维护的最小连接数。 |
socketTimeoutMS | 整型 |
| 指定在返回网络错误之前,等待套接字读取或写入返回的毫秒数。默认值为 |
serverSelectionTimeoutMS | 整型 |
| 指定找到一个可用且适合执行操作的服务器所允许等待的毫秒数。 |
heartbeatFrequencyMS | 整型 |
| 指定周期性后台服务器检查之间所需等待的毫秒数。 |
TLS | 布尔 |
| 指定是否与实例建立传输层安全 (TLS) 连接。在连接字符串中使用 DNS 种子列表 (SRV) 时,会自动设置为 |
w | 字符串或整数 |
| 指定写关注。要了解有关值的更多信息,请参阅有关写关注选项的服务器文档。 |
directConnection | 布尔 |
| 指定是否强制将所有操作分派到连接 URI 中指定的主机。 |
有关连接选项的完整列表,请参阅 ClientOptions API 文档。
单一超时设置
您可以通过 SetTimeout() 方法或在连接 URI 字符串中指定 timeoutMS 选项,在 Client 上设置一个单独的 Timeout 选项,以控制执行单个操作所需的时间。如果您没有为针对同一实体的操作设置上下文,则代码中其他位置的 Database、Collection、Session、ChangeStream 和 Bucket 实例将继承 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)
重要
旧版中的超时选项
SocketTimeout,wTimeout、MaxTime 和 MaxCommitTime 将在即将到来的版本中被弃用。如果您设置了 Timeout,驱动程序会忽略 MaxTime 和 MaxCommitTime。驱动程序仍然遵循所设定的 SocketTimeout 和 wTimeout,但这些设置可能会导致未定义的行为。考虑只使用单一超时选项。