Docs 菜单
Docs 主页
/ / /
Node.js
/ / /

指定要返回的字段

在此页面上

  • Overview
  • 示例文档
  • 单个字段
  • 多个字段

通过投影可以控制读取操作返回的文档中显示哪些字段。许多请求只需要某些字段,因此预测可以帮助您限制不必要的网络带宽使用。投影有两种工作方式:

  • 明确包含值为 1 的字段。这样做的不利影响是隐式排除所有未指定的字段。

  • 隐式排除值为 0 的字段。这样做的不利影响是会隐式包含所有未指定的字段。

这两种投影方法是互斥的:如果显式包含字段,则不能显式排除字段,反之亦然。

要按照本指南中的示例进行操作,请使用以下代码片段将描述水果的文档插入 myDB.fruits 集合中:

const myDB = client.db("myDB");
const myColl = myDB.collection("fruits");
await myColl.insertMany([
{ "_id": 1, "name": "apples", "qty": 5, "rating": 3 },
{ "_id": 2, "name": "bananas", "qty": 7, "rating": 1 },
{ "_id": 3, "name": "oranges", "qty": 6, "rating": 2 },
{ "_id": 4, "name": "avocados", "qty": 3, "rating": 5 },
]);

注意

您的查询操作可能会返回对包含匹配文档的游标的引用。 要学习;了解如何检查存储在游标中的数据,请参阅游标基础知识页面。

在以下查询中,传递投影以仅返回每个文档的 name 字段:

// return only* the name field
const projection = { name: 1 };
const cursor = myColl.find().project(projection);
for await (const doc of cursor) {
console.dir(doc);
}

投影文档将 name 的值指定为 1。这指示操作在结果中包含每个返回文档的 name 字段,并排除 qtyrating 字段。将此投影传递给 find(),同时使用空查询文档且未指定排序文档,会产生以下结果:

{ "_id": 1, "name": "apples" }
{ "_id": 2, "name": "bananas" }
{ "_id": 3, "name": "oranges" }
{ "_id": 4, "name": "avocados" }

该投影仅明确包含了 name 字段,但查询同时返回了 _id 字段!

之发生这种情况是因为 _id 字段是一个特例:除非另有明确指定,否则它始终包含在每个查询中。这是因为 _id 是每个文档的唯一标识符,该属性在构造查询时非常有用。movies 集合能够很好地说明此属性的价值:由于翻拍甚至独立作品有时会重复使用电影标题,因此您需要一个唯一的 _id 值来指代任何特定的电影。_id 是投影中互斥的包含-排除行为的唯一例外:如果您不希望 _id 出现在返回的文档中,即使在显式包含其他字段的情况下,您也可以显式排除 _id

// return only the name field
const projection = { _id: 0, name: 1 };
const cursor = myColl.find().project(projection);
for await (const doc of cursor) {
console.dir(doc);
}

投影文档将 name 的值指定为 1,并将 _id 的值指定为 0。这指示操作在结果中包含每个返回文档的 name 字段,并排除 _idqtyrating 字段。将此投影传递给 find(),同时使用空查询文档且未指定排序文档,会产生以下结果:

{ "name": "apples" }
{ "name": "bananas" }
{ "name": "oranges" }
{ "name": "avocados" }

您还可以指定要包含在投影中的多个字段。注: 投影中指定字段的顺序不会改变字段的返回顺序。

const projection = { _id: 0, rating: 1, name: 1 };
const cursor = myColl.find().project(projection);
for await (const doc of cursor) {
console.dir(doc);
}

此示例标识了要包含在投影中的两个字段,产生了以下结果:

{ "name": "apples", "rating": 3 }
{ "name": "bananas", "rating": 1 }
{ "name": "oranges", "rating": 2 }
{ "name": "avocados", "rating": 5 }

有关其他投影示例,请参阅MongoDB 手册页面上要从查询返回的投影字段。

后退

限制返回结果的数量