查询返回的投影字段


进入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”)不会对数组的第一个元素进行投影。

进入MongoDB中文手册(4.2版本)目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值