数据库和集合
Overview
在本指南中,您可以学习;了解如何使用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
删除集合
您可以通过在 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
实例传递给用于实例化 MongoClient
的 MongoClientSettings
。
在以下代码示例中,传递给 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)
LocalThreshold
如果多个副本集成员与您指定的读取偏好(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 文档
要进一步了解本指南所讨论的任何类型或方法,请参阅以下 API 文档: