文档菜单
文档首页
/ / /
Kotlin 协程
/

数据库和集合

本页内容

  • 概述
  • 访问数据库
  • 访问集合
  • 指定返回类型
  • 创建集合
  • 文档验证
  • 获取集合列表
  • 删除集合
  • 指定读取偏好、读取关注点和写入关注点

本指南中,您可以学习如何使用MongoDB Kotlin驱动程序使用MongoDB数据库和集合。

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

  1. 数据库:数据库是MongoDB实例中数据组织的最高级别。

  2. 集合:数据库组织到集合中,其中包含文档

  3. 文档:文档包含诸如字符串、数字和日期等字面数据,以及其他嵌入式文档。有关文档字段类型和结构的更多信息,请参阅服务器文档中的文档.

使用MongoDB Kotlin驱动程序,您可以使用Kotlin数据类或使用Document类来存储和检索MongoDB中的数据。

有关使用数据类的更多信息,请参阅数据类数据格式指南。有关使用Document类的更多信息,请参阅文档数据格式指南

使用getDatabase()方法访问MongoDB实例中的MongoDatabase。

以下示例访问名为testDatabase的数据库

val database = client.getDatabase("testDatabase")

使用 MongoDatabase 实例的 getCollection() 方法来访问您连接的 MongoDB 实例数据库中的 MongoCollection

以下示例从一个包含 ExampleDataClass 类型文档的 MongoDatabase 访问名为 testCollection 的集合。

ExampleDataClass 数据模型
data class ExampleDataClass(
@BsonId val id: ObjectId = ObjectId(),
val exampleProperty: String,
)
val collection = database.getCollection<ExampleDataClass>("testCollection")

提示

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

驱动程序提供了一种方法,允许您为从集合中返回的文档指定一个类,即使它与检索集合时指定的类不同。您可以通过使用 MongoCollection.withDocumentClass() 方法来指定返回类。

在以下情况下指定不同的返回类可能很有用

  • 您的集合包含多种数据类型。

  • 您指定了一个投影,该投影会更改您的数据字段。

  • 您不能直接在更改数据的函数上指定返回类型,例如 findOneAndUpdate()findOneAndReplace()

以下示例检索一个包含由 Fruit 数据类表示的数据的集合,但以 NewFruit 类的实例返回 findOneAndUpdate() 操作的结果。该操作将 qty 字段的名称更改为 quantity,并在具有 name 值为 "strawberry" 的文档中的 seasons 数组字段中添加一个项目。

水果数据模型
data class Fruit(
@BsonId val id: Int,
val name: String,
val qty: Int,
val seasons: List<String>
)
val collection =
database.getCollection<Fruit>("fruits")
// Define a data class for returned documents
data class NewFruit(
@BsonId val id: Int,
val name: String,
val quantity: Int,
val seasons: List<String>
)
val filter = Filters.eq(Fruit::name.name, "strawberry")
val update = Updates.combine(
Updates.rename(Fruit::qty.name, "quantity"),
Updates.push(Fruit::seasons.name, "fall"),
)
val options = FindOneAndUpdateOptions()
.returnDocument(ReturnDocument.AFTER)
// Specify the class for returned documents as the type parameter in withDocumentClass()
val result = collection
.withDocumentClass<NewFruit>()
.findOneAndUpdate(filter, update, options)
println(result)
NewFruit(id=1, name=strawberry, quantity=205, seasons=[summer, fall])

使用 MongoDatabase 实例的 createCollection() 方法在连接的 MongoDB 实例的数据库中创建一个集合。

以下示例创建一个名为 exampleCollection 的集合。

database.createCollection("exampleCollection")

您可以使用创建集合选项类来指定集合选项,例如最大大小和文档验证规则。`createCollection()`方法接受一个`CreateCollectionOptions`实例作为可选的第二个参数。

文档验证 在向集合写入时,提供了对一系列过滤器的验证功能。您可以使用 ValidationOptions 类指定这些过滤器,该类接受一系列 Filters 实例,这些实例指定了验证规则和表达式

val collOptions: ValidationOptions = ValidationOptions().validator(
Filters.or(
Filters.exists("title"),
Filters.exists("name")
)
)
database.createCollection(
"movies",
CreateCollectionOptions().validationOptions(collOptions)
)

有关更多信息,请参阅有关 文档验证 的服务器文档。

您可以使用MongoDatabase.listCollectionNames()方法查询数据库中的集合列表

val collectionList = database.listCollectionNames().toList()
println(collectionList)
[movies, exampleCollection]

您可以使用MongoCollection.drop()方法从数据库中删除集合

val collection =
database.getCollection<ExampleDataClass>("movies")
collection.drop()

警告

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

从数据库中删除集合也会永久删除该集合中的所有文档以及该集合上的所有索引。仅删除不再需要的包含数据的集合。

读取偏好读取关注点写入关注点控制驱动程序如何路由读取操作,以及连接到MongoDB副本集时对读取和写入操作进行确认的方式。读取偏好和读取关注点适用于所有读取操作;写入关注点适用于所有写入操作。

MongoDatabase实例从创建它们的MongoClient继承其写入关注点、读取关注点和写入偏好设置。MongoCollection实例从创建它们的MongoDatabase继承其写入关注点、读取关注点和写入偏好设置。然而,您可以使用以下方法获取具有与通常继承设置不同的读取偏好、读取关注点或写入关注点的MongoDatabaseMongoCollection实例

提示

withReadConcern()withReadPreference()withWriteConcern方法创建一个新的MongoDatabaseMongoCollection实例,具有所需的偏好或关注点。在调用此方法时,MongoDatabaseMongoCollection保留其原始的偏好和关注点设置。

有关这些主题的更多信息,请参阅服务器手册中的以下页面

返回

稳定API