文档菜单
文档首页
/ / /
Java 同步驱动程序
/ / /

指定要返回的字段

在本页

  • 概述
  • 行为
  • 说明

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

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

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

投影以两种方式工作

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

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

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

重要

The_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 },

在以下查询中,将投影传递给返回每个文档的 name 字段

// return all documents with *only* the name field
Bson filter = Filters.empty();
Bson projection = Projections.fields(Projections.include("name"));
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc));

投影文档指定读取操作结果应 包含 每个返回文档的 name 字段。因此,此投影隐式排除了 qtyrating 字段。将此投影与 find() 结合使用空查询过滤器会得到以下结果

{ "_id": 1, "name": "apples" }
{ "_id": 2, "name": "bananas" }
{ "_id": 3, "name": "oranges" }
{ "_id": 4, "name": "avocados" }

尽管此投影仅显式包含 name 字段,但查询还返回了 _id 字段。

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

一个 movies 集合是为什么这个属性有用的一个好例子:因为翻拍甚至单独的作品有时会重复使用电影标题,你需要一个唯一的 _id 值来引用任何特定的电影。

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

// return all documents with only the name field
Bson filter = Filters.empty();
Bson projection = Projections.fields(Projections.include("name"), Projections.excludeId());
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc));

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

{ "name": "apples" }
{ "name": "bananas" }
{ "name": "oranges" }
{ "name": "avocados" }

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

提示

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

Bson filter = Filters.empty();
Bson projection = Projections.fields(Projections.include("name", "rating"), Projections.excludeId());
collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc));

此示例识别了要包含在投影中的两个字段,得到以下结果

{ "name": "apples", "rating": 3 }
{ "name": "bananas", "rating": 1 }
{ "name": "oranges", "rating": 2 }
{ "name": "avocados", "rating": 5 }

有关其他投影示例,请参阅MongoDB 手册中关于从查询返回字段的部分.

返回

限制返回结果