Docs 菜单
Docs 主页
/ / /
Scala
/

连接至 MongoDB

在此页面上

  • 先决条件
  • MongoClient
  • 连接 URI
  • 连接到 MongoDB Atlas
  • 连接到本地 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实例。

重要

通常,您仅为给定 MongoDB 部署(例如独立部署、副本集或分片集群)仅创建一个MongoClient实例,并在整个应用程序中使用该客户端。 但是,如果您确实创建了多个实例,请记住以下几点:

  • 所有资源使用限制(例如最大连接数)均适用于每个MongoClient实例。

  • 要丢弃实例,请调用MongoClient.close()方法来清理资源。

连接 URI提供驱动程序用于连接到 MongoDB 部署的指令集。该指令集指示驱动程序应如何连接到 MongoDB,以及在连接时应如何运行。下图解释了示例连接 URI 的各个部分:

演示协议、凭据、主机名或 IP、端口和连接选项的连接字符串示例

在此示例中,您连接到具有 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=20w=majority

您可以使用以下连接片段来测试与 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 部署:

  • 实例化一个不带任何参数的MongoClient对象,以连接到在本地主机上运行的 MongoDB 服务器的端口27017

    val mongoClient = MongoClient()
  • 显式指定hostname以连接到在指定主机的端口27017上运行的 MongoDB 实例:

    val mongoClient = MongoClient("mongodb://host1")
  • 显式指定hostnameport

    val mongoClient = MongoClient("mongodb://host1:27017")

要连接到副本集,您必须为MongoClient apply 方法指定一个或多个成员。要了解有关副本集的更多信息,请参阅服务器手册中的复制

注意

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" )
  • 如果 mongoslocalhost: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())

在某些情况下,您可能需要将连接字符串与编程配置结合使用:

val connectionString = ConnectionString("mongodb://host1:27107,host2:27017/?ssl=true")
val myCommandListener: CommandListener = ???
val mongoClient = MongoClient(
MongoClientSettings.builder()
.addCommandListener(myCommandListener)
.applyConnectionString(connectionString)
.build())

要了解如何实现其他连接功能,请参阅以下教程:

后退

教程