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

指定要返回的字段

本页内容

  • 概述
  • 行为
  • 说明

在本指南中,您可以了解如何使用MongoDB Kotlin驱动程序控制哪些字段出现在从读取操作返回的文档中。

许多读取请求只需要文档的子集字段。例如,在用户登录时,您可能只需要他们的用户名,而不需要所有个人资料信息。默认情况下,MongoDB中的查询返回所有匹配文档的字段。您可以使用投影来仅返回所需的数据。

投影是一个文档,指示MongoDB返回文档的哪些字段。使用投影类来构造投影文档。

投影以两种方式工作

  • 显式包含字段。这会产生副作用,即隐式排除所有未指定的字段。

  • 隐式排除字段。这会产生副作用,即隐式包含所有未指定的字段。

这两种投影方法互斥:如果您显式包含字段,则不能显式排除字段,反之亦然。

重要

The_id字段不适用于这些机制。如果您不希望返回_id字段,则必须显式排除_id字段。即使您已经指定了某些包含的字段,您也可以排除_id字段。

考虑以下包含描述各种水果的文档的集合

{ "_id": 1, "name": "apples", "qty": 5, "rating": 3 },
{ "_id": 2, "name": "bananas", "qty": 7, "rating": 1 },
{ "_id": 3, "name": "oranges", "qty": 6, "rating": 2 },
{ "_id": 4, "name": "avocados", "qty": 3, "rating": 5 },

以下数据使用以下 Kotlin 数据类进行建模

data class Fruit(
@BsonId val id: Int,
val name: String,
val qty: Int,
val rating: Int
)

在以下查询中,将投影传递给返回每个文档的 name 字段。结果使用 FruitName Kotlin 数据类进行建模

data class FruitName(
@BsonId val id: Int? = null,
val name: String
)
// Return all documents with only the name field
val filter = Filters.empty()
val projection = Projections.fields(
Projections.include(FruitName::name.name)
)
val flowResults = collection.find<FruitName>(filter).projection(projection)
flowResults.collect { println(it)}
FruitName(id=1, name=apples),
FruitName(id=2, name=bananas),
FruitName(id=3, name=oranges),
FruitName(id=4, name=avocados)

投影文档指定读取操作的结果应 包含 每个返回文档的 name 字段。因此,此投影隐式排除了 qtyrating 字段。将此投影与空查询过滤器一起链接到 find() 得到上述结果。

尽管这个投影只显式包含了 name 字段,查询也返回了 _id 字段,在数据类中以 id 表示。

_id 字段是一个特例:它始终包含在每个查询结果中,除非显式排除。这是因为 _id 字段是每个文档的唯一标识符,这是一个在构建查询时有用的属性。

_id 是投影中互斥包含-排除行为中唯一的例外:如果您不想在返回的文档中包含 _id,即使显式包含其他字段,也可以显式排除 _id 字段。

data class FruitName(
@BsonId val id: Int? = null,
val name: String
)
// Return all documents with *only* the name field
// excludes the id
val filter = Filters.empty()
val projection = Projections.fields(
Projections.include(FruitName::name.name),
Projections.excludeId()
)
val flowResults = collection.find<FruitName>(filter).projection(projection)
flowResults.collect { println(it)}
FruitName(name=apples),
FruitName(name=bananas),
FruitName(name=oranges),
FruitName(name=avocados)

投影文档指定读取操作的结果应 包含 每个返回文档的 name 字段,并指定要 排除_id 字段。因此,此投影隐式排除了 qtyrating 字段。将此投影与空查询过滤器一起链接到 find() 得到上述结果。

您还可以指定要包含在投影中的多个字段。

提示

在投影中指定字段的顺序不会改变它们返回的顺序。

以下示例标识了要包含在投影中的两个字段,使用 FruitRating Kotlin 数据类得到以下结果

data class FruitRating(
val name: String,
val rating: Int
)
val filter = Filters.empty()
val projection = Projections.fields(
Projections.include(FruitRating::name.name, FruitRating::rating.name),
Projections.excludeId()
)
val flowResults = collection.find<FruitRating>(filter).projection(projection)
flowResults.collect { println(it)}
FruitRating(name=apples, rating=3),
FruitRating(name=bananas, rating=1),
FruitRating(name=oranges, rating=2),
FruitRating(name=avocados, rating=5)

有关投影的更多示例,请参阅MongoDB 指南中关于从查询返回字段的部分.

下一步

MongoDB Kotlin 驱动程序

本页内容