指定要返回的字段
Overview
在本指南中,您可以了解如何控制哪些字段出现在使用 MongoDB Kotlin 驱动程序进行读取操作返回的文档中。
许多读取请求仅需要文档中的部分字段。例如,当用户登录时,您可能只需要他们的用户名,而不需要他们的所有个人资料信息。默认情况下,MongoDB 中的查询返回匹配文档中的所有字段。您可以使用投影仅返回所需数据。
投影是一个文档,用于指示MongoDB返回文档的哪些字段。 使用投影类构造投影文档。
行为
投影有两种工作方式:
显式包含字段。此举的不利影响是会隐式排除所有未指定的字段。
隐性排除字段。这样做的不利影响是会隐式包含所有未指定的字段。
这两种投影方法是互斥的:如果显式包含字段,则不能显式排除字段,反之亦然。
重要
_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( val id: Int, val name: String, val qty: Int, val rating: Int )
在以下查询中,传递投影以返回每个文档的name
字段。 结果使用FruitName
Kotlin 数据类进行建模:
data class FruitName( 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
字段。因此,此投影隐式排除了qty
和rating
字段。使用空查询筛选器将此投影链接到find()
会产生上述结果。
尽管此投影仅显式包含name
字段,但查询还返回了_id
字段,在数据类中由id
表示。
_id
字段是一个特例:除非明确排除,否则它始终包含在每个查询结果中。这是因为 _id
字段是每个文档的唯一标识符,该属性在构造查询时有用。
_id
是投影中互斥的包含-排除行为的唯一例外:如果您不希望 _id
出现在返回的文档中,即使在显式包含其他字段的情况下,您也可以显式排除 _id
字段。
data class FruitName( 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
字段。因此,此投影隐式排除了qty
和rating
字段。 使用空查询筛选器将此投影链接到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 手册中关于从查询返回的项目字段的页面。