连接指南
概述
在本指南中,您可以学习如何使用Go驱动程序连接到MongoDB实例或副本集部署。
您可以使用Go驱动程序连接以下环境中的部署
MongoDB Atlas:云中MongoDB部署的全托管服务
MongoDB Enterprise:基于订阅的、自我管理的MongoDB版本
MongoDB Community:源代码可用、免费使用和自我管理的MongoDB版本
连接URI
连接URI(也称为连接字符串),告诉驱动程序如何连接到MongoDB以及如何在连接期间的行为。
连接URI的各个部分
以下示例解释了示例连接URI的各个部分

在本示例中,我们使用使用mongodb
作为协议,该协议指定了标准连接字符串格式。如果您需要更大的部署灵活性和在无需重新配置客户端的情况下更换服务器的能力,您还可以使用DNS种子列表连接格式。
连接字符串的下一部分包含您的数据库用户名以及如果您使用基于密码的认证,您的密码。将user
的值替换为您数据库用户名,将pass
的值替换为您密码。如果您使用不需要用户名和密码的认证机制,则省略此部分连接URI。
连接字符串的下一部分指定了MongoDB实例的主机名或IP地址以及端口号。在前面的示例中,我们使用sample.host
作为主机名,使用27017
作为端口号。将这些值替换为您MongoDB实例的对应值。
连接字符串的最后一部分指定了连接和认证选项。在示例中,我们设置了两个连接选项:maxPoolSize=20
和w=majority
。要了解更多关于连接选项的信息,请阅读本指南中的连接选项部分。
连接示例
要连接到MongoDB,您必须创建一个客户端。客户端管理您的连接并运行数据库命令。
提示
重用您的客户端
我们建议您在会话和操作中重复使用客户端。您可以使用相同的 Client
实例执行多个任务,而不是每次都创建一个新的实例。Client
类型适用于多个 goroutines 同时使用。有关驱动程序中连接池如何工作的更多信息,请参阅常见问题解答页面.
您可以通过将 ClientOptions
对象传递给 Connect()
方法来创建使用您的连接字符串和其他客户端选项的客户端。
要指定您的连接 URI,将其传递给 ApplyURI()
方法,该方法返回一个新的 ClientOptions
实例。要设置其他任何选项,请从 options
包中的相关辅助方法调用。
有关连接选项的更多信息,请参阅 连接选项部分。有关创建客户端的更多信息,请参阅 Client 和 Connect().
您可以将稳定API版本设置为选项,以避免在升级到新服务器版本时出现破坏性更改。有关稳定API功能的更多信息,请参阅稳定API页面。
以下代码演示了如何创建一个客户端,该客户端使用Atlas连接字符串和稳定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的信息,请参阅无服务器实例限制页面以确定所需的最低驱动程序版本。
连接到MongoDB的其他方法
如果您连接到的是不在Atlas上托管的单个MongoDB服务器实例或副本集,请参阅以下部分以了解如何连接。
连接到本地机器上的MongoDB服务器
如果您必须出于开发目的在本地机器上运行MongoDB服务器,请完成以下步骤
重要
始终确保您的MongoDB服务器免受恶意攻击。请参阅我们的安全清单,其中列出了安全建议。
成功启动您的MongoDB服务器后,在驱动程序连接代码中指定您的连接字符串。
如果您的MongoDB服务器在本地运行,您可以使用连接字符串 "mongodb://localhost:
,其中
是您配置服务器监听传入连接的端口号。
如果您想指定不同的主机名或IP地址,请参阅我们服务器手册中关于 连接字符串 的条目。
为了测试您是否可以连接到服务器,请将上述代码示例中的连接字符串替换为您的本地连接字符串。
连接到副本集
MongoDB副本集部署是一组相互连接的实例,它们存储相同的数据集。此配置提供了数据冗余和高数据可用性。
要连接到副本集部署,指定每个实例的主机名和端口号,用逗号分隔,并在连接字符串中将副本集名称作为 replicaSet
参数的值。在以下示例中,主机名分别是 host1
、host2
和 host3
,端口号均为 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 文档。
单次超时设置
您可以在您的 Client
上设置单个 Timeout
选项,以使用 SetTimeout()
方法或指定连接URI字符串中的 timeoutMS
选项来控制单个操作可以执行的时间。如果未为针对同一实体的操作设置上下文,则 Database
、Collection
、Session
、ChangeStream
和 Bucket
实例继承自 Client
的 Timeout
选项。
如果将具有截止时间的上下文传递到操作中,驱动程序将使用该上下文截止时间进行操作。如果没有上下文截止时间,则驱动程序将从给定上下文派生新的上下文,并使用在 Client
上设置的 Timeout
选项。
注意
超时规范下的重试
以下代码演示了如何使用SetTimeout
选项在客户端
上设置超时
选项。
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
将在未来的版本中弃用。如果设置了超时
,驱动程序将忽略MaxTime
和MaxCommitTime
。驱动程序仍然尊重SocketTimeout
和wTimeout
,但这些设置可能导致未定义的行为。请考虑只使用单个超时选项。