Docs 菜单
Docs 主页
/ / /
Java Reactive Streams 驱动程序
/

指定要返回的字段

在此页面上

  • Overview
  • 样本数据
  • 投影类型
  • 指定要包含的字段
  • 排除_id字段
  • 指定要排除的字段
  • 投影错误
  • 包含和排除错误
  • 更多信息
  • API 文档

在本指南中,您可以学习;了解如何使用Java Reactive Streams驾驶员来指定从读取操作中返回哪些字段。 您可以使用投影选择这些字段,投影是指定MongoDB从查询中返回哪些字段的文档。

本指南中的示例使用 Atlas示例数据集中 sample_restaurants.restaurants集合。 要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅入门指南。

重要

项目 Reactor 库

本指南使用 Project ReactorPublisher 库来使用Java Reactive Streams驾驶员方法返回的 实例。要学习;了解有关 Project Reactor 库及其使用方法的更多信息,请参阅 Reactor 文档中的“入门” 。要进一步学习;了解如何使用本指南中的 Project Reactor 库方法,请参阅“将数据写入MongoDB ”指南。

您可以使用投影来指定要在检索到的文档中包含和排除哪些字段。 默认,包含某些字段会排除所有其他字段,因此您无法在单个投影中组合包含和排除语句,除非要从结果中排除_id字段。

使用以下语法指定要包含在读取操作结果中的字段:

projection(fields(include("<field name>")))

要使用投影,请将查询过滤传递给find()方法。 然后,将projection()方法链接到find()方法调用。

以下示例使用find()方法检索name字段值为"Emerald Pub"的文档。 然后,它使用投影仅包含返回文档中的namecuisineborough字段。

FindPublisher<Document> findProjectionPublisher = restaurants.find(
eq("name", "Emerald Pub"))
.projection(fields(include("name", "cuisine", "borough")));
Flux.from(findProjectionPublisher)
.doOnNext(System.out::println)
.blockLast();
{'_id': ObjectId('...'), 'borough': 'Manhattan', 'cuisine': 'American', 'name': 'Emerald Pub'}
{'_id': ObjectId('...'), 'borough': 'Queens', 'cuisine': 'American', 'name': 'Emerald Pub'}

当您使用投影指定要包含在返回文档中的字段时,默认也会包含_id字段。 所有其他字段均会隐式排除。 您必须显式排除_id字段,才能从返回的文档中忽略它。

您可以使用excludeId()方法从返回的文档中排除_id字段。

以下示例执行与上一示例相同的查询,但也排除了返回文档中的_id字段:

FindPublisher<Document> findProjectionPublisher = restaurants.find(
eq("name", "Emerald Pub"))
.projection(fields(include("name", "cuisine", "borough"), excludeId()));
Flux.from(findProjectionPublisher)
.doOnNext(System.out::println)
.blockLast();
{'borough': 'Manhattan', 'cuisine': 'American', 'name': 'Emerald Pub'}
{'borough': 'Queens', 'cuisine': 'American', 'name': 'Emerald Pub'}

使用以下语法指定要从读取操作结果中排除的字段:

projection(fields(exclude("<field name>")))

要使用投影,请将查询过滤传递给find()方法。 然后,将projection()方法链接到find()方法调用。

以下示例使用find()方法查找name字段值为"Emerald Pub"的所有餐厅。 然后,它使用投影从返回的文档中排除gradesaddress字段。

FindPublisher<Document> findProjectionPublisher = restaurants.find(
eq("name", "Emerald Pub"))
.projection(fields(exclude("grades", "address")));
Flux.from(findProjectionPublisher)
.doOnNext(System.out::println)
.blockLast();
{'_id': ObjectId('...'), 'borough': 'Manhattan', 'cuisine': 'American', 'name': 'Emerald Pub', 'restaurant_id': '40367329'}
{'_id': ObjectId('...'), 'borough': 'Queens', 'cuisine': 'American', 'name': 'Emerald Pub', 'restaurant_id': '40668598'}

当您使用投影指定要排除的字段时,任何未指定的字段都将隐式包含在返回文档中。

以下部分介绍了使用投影时可能遇到的错误。

如果您尝试在单个投影中包含和排除字段,驾驶员会返回以下内容:

OperationFailure: ... Cannot Do Exclusion on Field <field> in Inclusion Projection

要解决此错误,请确保投影仅指定要包含的字段或要排除的字段。

要学习;了解有关投影的更多信息,请参阅MongoDB Server手册中的“项目字段”指南

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档:

  • find()

  • FindPublisher

后退

Retrieve Data