默认情况下,MongoDB中的查询返回匹配文档中的所有字段。为了限制MongoDB发送给应用程序的数据量,我们可以包含一个投影文档来指定或限制要返回的字段。

创建测试所需要的 inventory 集合:

db.inventory.insertMany( [
  { item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] },
  { item: "notebook", status: "A",  size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "C", qty: 5 } ] },
  { item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "A", qty: 60 } ] },
  { item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [ { warehouse: "A", qty: 40 } ] },
  { item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);

返回匹配文档中的所有字段

如果没有指定投影文档,db.collection.find()方法将返回匹配文档中的所有字段。

下面的示例返回库存集合中status等于“A”的所有文档中的所有字段:

db.inventory.find( { status: "A" } )

在这里插入图片描述
该操作对应如下SQL语句:

SELECT * from inventory WHERE status = "A"

只返回指定字段和_id字段

通过在投影文档中将<field>设置为1,投影可以显式地包含多个字段。下面的操作返回与查询匹配的所有文档。在结果集中,只返回匹配文档中的itemstatus和(默认情况下)_id字段。

db.inventory.find( { status: "A" }, { item: 1, status: 1 } )

在这里插入图片描述
该操作对应如下SQL语句:

SELECT _id, item, status from inventory WHERE status = "A"

排除_id字段

我们可以通过在投影中将_id字段设置为0来从结果中删除,如下例所示:

db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } )

在这里插入图片描述
该操作对应如下SQL语句:

SELECT item, status from inventory WHERE status = "A"

除了_id字段,不能在投影文档中组合包含和排除语句。

在这里插入图片描述

返回除排除字段外的所有字段

我们可以使用投影来排除特定字段,而不是列出要在匹配文档中返回的字段。下面的示例返回匹配文档中除了statusstock字段以外的所有字段:

db.inventory.find( { status: "A" }, { status: 0, instock: 0 } )

在这里插入图片描述

除了_id字段,不能在投影文档中组合包含和排除语句。(详情查看上面例子)

返回嵌入文档中的特定字段

可以返回嵌入文档中的特定字段。使用点表示法引用嵌入字段,并在投影文档中设置为1。

下面的例子返回:

  • _id字段(默认返回),
  • item字段,
  • status字段,
  • size 文档中的uom字段。
db.inventory.find(
   { status: "A" },
   { item: 1, status: 1, "size.uom": 1 }
)

在这里插入图片描述
从MongoDB 4.4开始,还可以使用嵌套表单指定嵌入字段,例如{item: 1, status: 1, size: {uom: 1}}

抑制嵌入文档中的特定字段

可以抑制嵌入文档中的特定字段。使用点表示法引用投影文档中的嵌入字段,并将其设置为0。

下面的示例指定一个投影,以排除size文档中的uom字段。所有其他字段在匹配文档中返回:

db.inventory.find(
   { status: "A" },
   { "size.uom": 0 }
)

在这里插入图片描述
从MongoDB 4.4开始,还可以使用嵌套形式指定嵌入字段,例如{ size: { uom: 0 } }

数组中嵌入文档的投影

使用点表示法来投影嵌入在数组中的文档中的特定字段。

下面的示例指定要返回的投影:

  • _id字段(默认返回),
  • item字段,
  • status字段,
  • 嵌入在inventory数组中的文档中的qty字段。
db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } )

在这里插入图片描述

返回数组中的项目特定数组元素

对于包含数组的字段,MongoDB提供了以下投影运算符来操作数组:$elemMatch$slice$

下面的例子使用$slice投影运算符返回stock数组中的最后一个元素:

db.inventory.find( { status: "A" }, { item: 1, status: 1, instock: { $slice: -1 } } )

在这里插入图片描述

$elemMatch$slice$是投影要包含在返回数组中的特定元素的唯一方法。例如,不能使用数组索引投影特定的数组元素;例如:{" stock. "0": 1}投影不会投影包含第一个元素的数组。

其他考虑 / 其他注意事项

See also:

Logo

数据库是今天社会发展不可缺少的重要技术,它可以把大量的信息进行有序的存储和管理,为企业的数据处理提供了强大的保障。

更多推荐