对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

查询返回的项目字段


➤ 使用右上角的 Select your language(选择语言)下拉菜单,设置以下示例的语言。


➤ 使用右上角的 Select your language(选择语言)下拉菜单,设置以下示例的语言或选择 MongoDB Compass。


默认情况下,MongoDB 中的查询返回匹配文档中的所有字段。要限制 MongoDB 发送到应用程序的数据量,可以添加投影文档来指定或限制要返回的字段。

本页面将借助 mongosh 中的 db.collection.find() 方法展示带有投影的查询操作示例。

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() 方法将返回匹配文档中的所有字段。

如下示例将返回 inventory 集合中的所有文档的所有字段,其中的 status 等于 "A":

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

此操作对应于以下 SQL 语句:

SELECT * from inventory WHERE status = "A"

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

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

此操作对应于以下 SQL 语句:

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

您可通过在投影中将其设为 0 以便从结果中删除 _id 字段,如以下示例所示:

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

此操作对应于以下 SQL 语句:

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

注意

除 _id 字段之外,您无法在投影文档中合并包含与排除声明。

您可以使用投影来排除特定字段,而不必在匹配文档中列出要返回的字段。以下示例将在匹配文档中返回除 status 和 instock 字段之外的所有字段:

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

注意

除 _id 字段之外,您无法在投影文档中合并包含与排除声明。

您可以返回嵌入式文档中的特定字段。使用点符号引用嵌入式字段,并在投影文档中设为 1。

以下示例将返回:

  • _id 字段(默认返回)、

  • item 字段。

  • status 字段。

  • size 文档中的 uom 字段。

uom 字段仍会嵌入在 size 文档中。

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

您还可以使用嵌套表单指定嵌入式字段。例如:{ item: 1, status: 1, size: { uom: 1 } }。

您可以隐藏嵌入式文档中的特定字段。使用点符号引用投影文档中的嵌入式字段,并设为 0。

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

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

您还可以使用嵌套表单指定嵌入式字段。例如:{ size: { uom: 0 } }。

使用点符号来投影嵌入数组中的文档内的特定字段。

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

  • _id 字段(默认返回)、

  • item 字段。

  • status 字段。

  • 嵌入到 instock 数组中的文档内的 qty 字段。

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

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

如下示例使用 $slice 投影操作符返回 instock 数组中的最后一个元素:

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

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

您可以在查询投影中指定聚合表达式。通过使用聚合表达式,您可以投影新字段并修改现有字段的值。

例如,以下操作使用聚合表达式覆盖 status 字段的值,并投影新字段 area 和 reportNumber。

注意

以下示例使用 MongoDB Shell 语法。有关使用聚合的投影的驱动程序示例,请参阅您的驱动程序文档。

db.inventory.find( { }, { _id: 0, item: 1, status: { $switch: { branches: [ { case: { $eq: [ "$status", "A" ] }, then: "Available" }, { case: { $eq: [ "$status", "D" ] }, then: "Discontinued" }, ], default: "No status found" } }, area: { $concat: [ { $toString: { $multiply: [ "$size.h", "$size.w" ] } }, " ", "$size.uom" ] }, reportNumber: { $literal: 1 } })
[ { item: 'journal', status: 'Available', area: '294 cm', reportNumber: 1 }, { item: 'planner', status: 'Discontinued', area: '685.5 cm', reportNumber: 1 }, { item: 'notebook', status: 'Available', area: '93.5 in', reportNumber: 1 }, { item: 'paper', status: 'Discontinued', area: '93.5 in', reportNumber: 1 }, { item: 'postcard', status: 'Available', area: '152.5 cm', reportNumber: 1 }]
  • 当您使用$project聚合阶段时,它通常应该是管道中的最后一个阶段,用于指定要返回给客户端的字段。

    在管道的开头或中间使用 $project 阶段来减少传递到后续管道阶段的字段数量不太可能提高性能,因为数据库会自动执行此优化。

  • MongoDB 对投影执行额外的限制。有关详细信息,请参阅投影限制。