连接至 MongoDB
本指南介绍如何使用Scala驾驶员连接到MongoDB。
使用 MongoClient()
方法连接到正在运行的 MongoDB 部署。
重要
以下示例并未提供实例化MongoClient
的方法的详尽列表。 有关MongoClient
伴随方法的完整列表,请参阅 MongoClient API文档。
注意
我们强烈建议为系统 keep-alive 设置配置较短的超时时间。
请参阅TCP keepalive 时间是否影响MongoDB部署? 服务器手册常见问题解答问题回答中的问题与解答,了解更多信息。
先决条件
您必须设置以下组件才能运行本指南中的代码示例:
要连接的运行的MongoDB 部署。 示例,要连接到独立运行运行的部署,您必须有权访问权限运行的独立运行运行的部署。
项目中安装的驱动程序依赖项。 要学习;了解如何安装驾驶员,请参阅安装。
以下 import 语句:
import org.mongodb.scala._ import scala.collection.JavaConverters._
MongoClient
MongoClient
实例表示数据库的连接池。 即使在运行多个并发操作时,也只需要一个MongoClient
实例。
重要
通常,您仅为给定 MongoDB 部署(例如独立部署、副本集或分片集群)仅创建一个MongoClient
实例,并在整个应用程序中使用该客户端。 但是,如果您确实创建了多个实例,请记住以下几点:
所有资源使用限制(例如最大连接数)均适用于每个
MongoClient
实例。要丢弃实例,请调用
MongoClient.close()
方法来清理资源。
连接 URI
连接 URI提供驱动程序用于连接到 MongoDB 部署的指令集。该指令集指示驱动程序应如何连接到 MongoDB,以及在连接时应如何运行。下图解释了示例连接 URI 的各个部分:
在此示例中,您连接到具有 DNS SRV 记录的 Atlas MongoDB 部署。有关详细信息,请参阅 DNS 种子列表连接格式文档。这种格式提供了部署灵活性以及轮换更改服务器而无需重新配置客户端的能力。
注意
如果您的部署是在MongoDB Atlas上,请参阅Atlas驱动程序连接指南,并从语言下拉列表中选择 Scala 以检索连接string 。
如果您要连接到没有 DNS SRV 地址的实例或副本集,则必须为协议使用 mongodb
,该协议指定了标准连接字符串格式。
如果您使用基于密码的身份验证机制,则在协议之后,连接字符串将包含您的凭据。将 user
的值替换为您的用户名,将 pass
替换为您的密码。如果您的身份验证机制不需要凭据,请忽略连接 URI 的这一部分。
连接 URI 的下一部分指定主机名或 IP 地址,后跟 MongoDB 实例的端口。在示例中,sample.host
代表主机名,27017
是端口号。替换这些值以参考您的 MongoDB 实例。
连接 URI 的最后一部分包含作为参数的连接选项。 该示例设置了两个连接选项: maxPoolSize=20
和w=majority
。
连接到 MongoDB Atlas
您可以使用以下连接片段来测试与 Atlas 上 MongoDB 部署的连接:
import com.mongodb.{ServerApi, ServerApiVersion} import org.mongodb.scala.{ConnectionString, MongoClient, MongoClientSettings} import org.mongodb.scala.bson.Document import scala.concurrent.Await import scala.concurrent.duration.DurationInt import scala.util.Using object MongoClientConnectionExample { def main(args: Array[String]): Unit = { // Replace the placeholder with your Atlas connection string val connectionString = "<connection string>"; // Construct a ServerApi instance using the ServerApi.builder() method val serverApi = ServerApi.builder.version(ServerApiVersion.V1).build() val settings = MongoClientSettings .builder() .applyConnectionString(ConnectionString(connectionString)) .serverApi(serverApi) .build() // Create a new client and connect to the server Using(MongoClient(settings)) { mongoClient => // Send a ping to confirm a successful connection val database = mongoClient.getDatabase("admin") val ping = database.runCommand(Document("ping" -> 1)).head() Await.result(ping, 10.seconds) System.out.println("Pinged your deployment. You successfully connected to MongoDB!") } } }
此连接代码段使用 Stable API 功能,可以在使用 Scala 驱动程序 v4.3 及更高版本连接到 MongoDB Server v5.0 及更高版本时启用该功能。使用此功能时,可以更新驱动程序或服务器,而不必担心 Stable API 涵盖的任何命令的向后兼容性问题。
如需了解有关“Stable API”功能的更多信息,请参阅“服务器”手册中的“Stable API”。
连接到本地MongoDB部署
您可以通过以下方式连接到本地 MongoDB 部署:
实例化一个不带任何参数的
MongoClient
对象,以连接到在本地主机上运行的 MongoDB 服务器的端口27017
:val mongoClient = MongoClient() 显式指定
hostname
以连接到在指定主机的端口27017
上运行的 MongoDB 实例:val mongoClient = MongoClient("mongodb://host1") 显式指定
hostname
和port
:val mongoClient = MongoClient("mongodb://host1:27017")
连接到副本集
要连接到副本集,必须为MongoClient
应用方法指定一个或多个成员。 要学习;了解有关副本集的更多信息,请参阅服务器手册中的复制。
注意
MongoDB 自动发现副本集中的主节点和从节点。
您可以通过在ConnectionString
中指定节点来连接到MongoDB副本集。
以下示例显示如何指定副本集的三个成员:
val mongoClient = MongoClient("mongodb://host1:27017,host2:27017,host3:27017")
以下示例展示如何指定副本集的成员以及使用副本集名称的replicaSet
选项:
val mongoClient = MongoClient("mongodb://host1:27017,host2:27017,host3:27017/?replicaSet=myReplicaSet")
以下示例显示如何指定与所有副本集节点相对应的ServerAddress
实例列表:
val mongoClient = MongoClient( MongoClientSettings.builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List( new ServerAddress("host1", 27017), new ServerAddress("host2", 27017), new ServerAddress("host3", 27017)).asJava)) .build())
连接到分片集群
要连接到分片集群,请为MongoClient
apply 方法指定一个或多个mongos
实例。 要了解有关分片集群的更多信息,请参阅MongoDB MongoDB Server手册中的分片。
您可以通过以下方式连接到单个mongos
实例:
在
ConnectionString
中指定主机名和端口:val mongoClient = MongoClient( "mongodb://localhost:27017" ) 如果
mongos
在localhost:27017
上运行,则排除连接string :val mongoClient = MongoClient()
您可以通过以下方式连接到多个mongos
实例:
指定
ConnectionString
以包含其主机名和端口:val mongoClient = MongoClient("mongodb://host1:27017,host2:27017") 指定与每个实例对应的
ServerAddress
对象的列表:val mongoClient = MongoClient( MongoClientSettings.builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List( new ServerAddress("host1", 27017), new ServerAddress("host2", 27017)).asJava)) .build())
连接选项
您可以使用ConnectionString
和/或MongoClientSettings
类型来指定连接设置。
示例,您可以在连接string中指定 TLS/SSL 和身份验证设置:
val mongoClient = MongoClient("mongodb://user1:pwd1@host1/?authSource=db1&ssl=true")
您还可以使用MongoClientSettings
实例指定 TLS/SSL 和MongoCredential
类型来存储身份验证信息:
val user: String = // the user name val source: String = // the source where the user is defined val password: Array[Char] = // the password as a character array // ... val credential = MongoCredential.createCredential(user, source, password) val mongoClient: MongoClient = MongoClient( MongoClientSettings.builder() .applyToSslSettings((builder: SslSettings.Builder) => builder.enabled(true)) .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List(new ServerAddress("host1", 27017)).asJava)) .credential(credential) .build())
在某些情况下,您可能需要将连接string与编程配置结合使用:
val connectionString = ConnectionString("mongodb://host1:27107,host2:27017/?ssl=true") val myCommandListener: CommandListener = ??? val mongoClient = MongoClient( MongoClientSettings.builder() .addCommandListener(myCommandListener) .applyConnectionString(connectionString) .build())
连接教程
要了解如何实现其他连接功能,请参阅以下教程: