目录
进入MongoDB中文手册(4.2版本)目录
默认情况下,MongoDB中的查询返回匹配文档中的所有字段。要限制MongoDB发送给应用程序的数据量,可以通过一个投影文档来指定或限制要返回的字段。
本章节提供使用MongoDB Java同步驱动程序中的com.mongodb.client.MongoCollection.find方法进行有投影的查询操作的示例。
提示
该驱动程序提供com.mongodb.client.model.Filters帮助器,以帮助创建过滤器文档。本章节的示例使用该方法来创建过滤器文档。
本章节的示例使用inventory 集合。要填充inventory集合,请运行以下命令:
collection.insertMany(asList(
Document.parse("{ item: 'journal', status: 'A', size: { h: 14, w: 21, uom: 'cm' }, instock: [ { warehouse: 'A', qty: 5 }]}"),
Document.parse("{ item: 'notebook', status: 'A', size: { h: 8.5, w: 11, uom: 'in' }, instock: [ { warehouse: 'C', qty: 5}]}"),
Document.parse("{ item: 'paper', status: 'D', size: { h: 8.5, w: 11, uom: 'in' }, instock: [ { warehouse: 'A', qty: 60 }]}"),
Document.parse("{ item: 'planner', status: 'D', size: { h: 22.85, w: 30, uom: 'cm' }, instock: [ { warehouse: 'A', qty: 40}]}"),
Document.parse("{ item: 'postcard', status: 'A', size: { h: 10, w: 15.25, uom: 'cm' }, "
+ "instock: [ { warehouse: 'B', qty: 15 }, { warehouse: 'C', qty: 35 } ] }")
));
1 返回匹配文档的所有字段
如果未指定投影(projection),则 com.mongodb.client.MongoCollection.find方法将返回匹配文档中的所有字段。
下面的示例返回inventory集合中status等于 "A"的所有文档的所有字段:
FindIterable<Document> findIterable = collection.find(eq("status", "A"));
该操作对应以下SQL语句:
SELECT * from inventory WHERE status = "A"
2 只返回指定的字段和_id字段
通过在投影文档中将字段设置为1来明确包含的多个字段。以下操作返回与查询匹配的所有文档。在结果集中,只有item,status以及默认情况下,_id字段会返回。
findIterable = collection.find(eq("status", "A")).projection(include("item", "status"));
该操作对应以下SQL语句:
SELECT _id, item, status from inventory WHERE status = "A"
3 禁止返回_id字段
您可以通过在投影中将_id设置为0来明确从返回结果中删除该字段 ,如以下示例所示。
要指定投影文档,请将 com.mongodb.client.FindIterable.projection方法链接到find方法。该示例使用 com.mongodb.client.model.Projections类创建投影文档。
findIterable = collection.find(eq("status", "A"))
.projection(fields(include("item", "status"), excludeId()));
该操作对应以下SQL语句:
SELECT item, status from inventory WHERE status = "A"
注意
除该_id字段外,您无法在投影文档中合并包含(inclusion )和排除(exclusion )语句。
4 返回排除后的所有字段
您可以使用投影排除特定字段,而不用列出要在匹配文档中返回的字段。以下示例返回 匹配文档中的status和instock字段以外的所有字段:
要指定投影文档,请将 com.mongodb.client.FindIterable.projection方法链接到find方法。该示例使用 com.mongodb.client.model.Projections类创建投影文档。
findIterable = collection.find(eq("status", "A")).projection(exclude("item", "status"));
注意
除该_id字段外,您无法在投影文档中合并包含(inclusion )和排除(exclusion )语句。
5 嵌入文档指定返回字段
您可以返回嵌入式文档中的特定字段。使用点符号引用嵌入式字段并在投影文档中将其设置为1。
以下示例返回:
- _id字段(默认情况下返回),
- item字段,
- status字段,
- size文档中的uom字段。
uom字段嵌入在size文档中。
要指定投影文档,请将 com.mongodb.client.FindIterable.projection方法链接到find方法。该示例使用 com.mongodb.client.model.Projections类创建投影文档。
findIterable = collection.find(eq("status", "A")).projection(include("item", "status", "size.uom"));
6 嵌入文档指定排除字段
您可以排除嵌入式文档中的特定字段。在投影文档中使用点符号引用的嵌入字段并将其设置为0。
下面的示例指定投影来排除size文档中的uom字段。其他所有字段均在匹配的文档中返回。
要指定投影文档,请将 com.mongodb.client.FindIterable.projection方法链接到find方法。该示例使用 com.mongodb.client.model.Projections类创建投影文档。
findIterable = collection.find(eq("status", "A")).projection(exclude("size.uom"));
7 数组中的嵌入文档指定投影
使用点符号可以在嵌入数组的文档中指定特定投影字段。
以下示例指定要返回的投影:
- _id字段(默认情况下返回),
- item字段,
- status字段,
- 嵌入在instock数组中的文档的qty字段。
要指定投影文档,请将 com.mongodb.client.FindIterable.projection方法链接到find方法。该示例使用 com.mongodb.client.model.Projections类创建投影文档。
findIterable = collection.find(eq("status", "A")).projection(include("item", "status", "instock.qty"));
8 数组元素指定投影
对于包含数组的字段,MongoDB的提供了如下的投影运算符用来操作数组:$elemMatch, $slice,和$。
以下示例使用$slice投影运算符返回instock数组中的最后一个元素。
要指定投影文档,请将 com.mongodb.client.FindIterable.projection方法链接到find方法。该示例使用 com.mongodb.client.model.Projections类创建投影文档。
findIterable = collection.find(eq("status", "A"))
.projection(fields(include("item", "status"), slice("instock", -1)));
$elemMatch,$slice和 $是投影特定元素使其在数组中返回的唯一方法。例如,您不能 使用数组索引来投影特定的数组元素。例如, include(“instock.0”)不会对数组的第一个元素进行投影。