Docs 菜单

数据库和集合

在本指南中,您可以学习;了解如何使用Scala驾驶员与MongoDB数据库和集合交互。

MongoDB 将数据组织成以下级别的层次结构:

  • 数据库: MongoDB 部署中用于存储集合的顶级数据结构。

  • 集合: MongoDB文档组。 它们类似于关系数据库中的表。

  • 文档:存储字面数据(例如string 、数字、日期和其他嵌入式文档)的单位。 有关文档字段类型和结构的更多信息,请参阅MongoDB Server手册中的文档指南。

通过在 MongoClient实例上调用 getDatabase() 方法来访问数据库。

以下示例将访问名为"test_database"的数据库:

val database = mongoClient.getDatabase("test_database")

通过在 MongoDatabase实例上调用 getCollection() 方法来访问集合。

以下示例访问名为 "test_collection" 的集合:

val collection = database.getCollection("test_collection")

提示

如果提供的集合名称在数据库中尚不存在,则当您首次向其中插入数据时,MongoDB 会隐式创建该集合。

MongoDatabase实例上使用 createCollection() 方法可在数据库中显式创建集合。

以下示例创建了一个名为"example_collection"的collection:

val createObservable = database.createCollection("example_collection")
Await.result(createObservable.toFuture(), Duration(10, TimeUnit.SECONDS))

您可以通过将 CreateCollectionOptions实例传递给 createCollection() 方法来指定集合选项,例如最大大小和文档验证规则。 有关可选参数的完整列表,请参阅MongoDB Server手册中的创建命令文档。

您可以通过调用 MongoDatabase实例的 listCollections() 方法来查询数据库中的集合列表。

以下示例列出了数据库中的所有集合:

val results = Await.result(database.listCollections().toFuture(), Duration(10, TimeUnit.SECONDS))
results.foreach(println)
Iterable((name,BsonString{value='test_collection'}), (type,BsonString{value='collection'}), ... )
Iterable((name,BsonString{value='example_collection'}), (type,BsonString{value='collection'}), ... )

要仅查询数据库中集合的名称,请调用listCollectionNames()方法,如下所示:

val results = Await.result(database.listCollectionNames().toFuture(), Duration(10, TimeUnit.SECONDS))
results.foreach(println)
test_collection
example_collection

提示

有关遍历Future 实例的更多信息,请参阅《访问来自可观察对象的数据》指南中的 使用未来检索所有结果。

您可以通过在 MongoCollection实例上调用 drop() 方法来删除集合。

以下示例删除"test_collection"集合:

val deleteObservable = database.getCollection("test_collection").drop()
Await.result(deleteObservable.toFuture(), Duration(10, TimeUnit.SECONDS))

警告

删除集合会删除该集合中的所有数据

从数据库中删除集合会永久删除该集合中的所有文档和所有索引。

仅当不再需要集合中的数据时才删除集合。

您可以通过设置读取偏好来控制驱动程序路由读取操作的方式。 您还可以通过设置读关注写关注来控制驱动程序如何等待副本集上读写操作确认的选项。

默认下,数据库从 MongoClient实例继承这些设置,集合从数据库继承这些设置。 但是,您可以使用 withReadPreference() 方法更改数据库的这些设置。

以下示例访问数据库,同时将数据库的读取偏好(read preference)指定为 secondary

val databaseWithReadPrefs =
mongoClient.getDatabase("test_database").withReadPreference(ReadPreference.secondary())

还可以使用 withReadPreference() 方法更改集合的读取和写入设置。 以下示例展示了如何访问权限集合,同时将集合的读取偏好(read preference)指定为 secondary

val collectionWithReadPrefs =
database.getCollection("test_collection").withReadPreference(ReadPreference.secondary())

要了解有关读取和写入设置的更多信息,请参阅 MongoDB Server 手册中的以下指南:

在MongoDB Server中,您可以根据您选择的任何条件将键值标签应用副本集成员。然后,您可以使用这些标签来定位一个或多个成员以执行读取操作。

默认下, Scala驾驶员在选择要读取的成员时会忽略标签。 要指示Scala驾驶员首选某些标签,请将 TagSet实例传递给 ReadPreference 构造函数,然后将 ReadPreference实例传递给用于实例化 MongoClientMongoClientSettings

在以下代码示例中,传递给 ReadPreference 构造函数的标签集指示Scala驾驶员优先从纽约数据中心('dc': 'ny') 读取数据,并回退到旧金山数据中心('dc': 'sf'):

val tag1 = new Tag("dc", "ny")
val tag2 = new Tag("dc", "sf")
val tagSet = new TagSet(List(tag1, tag2).asJava)
val connectionString = ConnectionString("<connection string URI>")
val readPreference = ReadPreference.primaryPreferred(tagSet)
val mongoClientSettings = MongoClientSettings.builder()
.applyConnectionString(connectionString)
.readPreference(readPreference)
.build()
val clientWithTags = MongoClient(mongoClientSettings)

如果多个副本集成员与您指定的读取偏好(read preference)和标签集匹配,则Scala驾驶员将从根据其网络探测(ping)时间选择的最近副本集成员中读取。

默认情况下,驾驶员仅使用 ping 时间与最近节点的网络探测(ping)时间在 15 毫秒以内的节点进行查询。 要在延迟较高的成员之间分配读取,请使用 MongoClientSettings.Builder 类的 applyToClusterSettings() 方法提供的 ClusterSettings.Builder区块中的 localThreshold() 方法。 或者,在连接字符串URI 中包含 localThresholdMS 参数。

以下示例连接到在 localhost:27017 上运行的MongoDB 部署,并指定 35 毫秒的本地阈值:

val connectionString = ConnectionString("mongodb://localhost:27017")
val mongoClientSettings = MongoClientSettings.builder()
.applyConnectionString(connectionString)
.applyToClusterSettings(builder => builder.localThreshold(35, TimeUnit.MILLISECONDS))
.build()
val client = MongoClient(mongoClientSettings)

在前面的示例中, Scala驾驶员在最近成员的网络探测(ping)时间的 35 毫秒内在匹配成员之间分配读取。

要进一步了解本指南所讨论的任何类型或方法,请参阅以下 API 文档: