连接指南
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,必须创建一个客户端。客户端可管理您的连接并运行数据库命令。
提示
客户端重用
您可以通过将 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,请参阅“无服务器实例限制”页面,以确定所需的最低驱动程序版本。
连接 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 字符串。
当指定主机不是主节点时,写入失败。
当指定主机不是主节点时,需要指定从节点读取偏好。
连接选项
本部分介绍几个常见的 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
选项,以控制执行单个操作所需的时间。如果您没有为针对同一实体的操作设置上下文,则代码中其他位置的 Database
、Collection
、Session
、ChangeStream
和 Bucket
实例将继承 Client
中的 Timeout
选项。
如果您在操作中传递了一个具有截止时间的上下文,驱动程序将使用该上下文的截止时间执行操作。如果上下文没有截止时间,则驱动程序会使用 Client
上设置的 Timeout
选项基于给定上下文派生出新的上下文。
注意
超时规范下的重试
以下代码展示了如何使用 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
,但这些设置可能会导致未定义的行为。考虑只使用单一超时选项。