# 从查询返回的项目字段

默认情况下，MongoDB的查询语句返回匹配到文档的所有字段，为了限制MongoDB返回给应用的数据，可以通过[projection](https://docs.mongodb.com/v4.0/reference/glossary/#term-projection)文档来指定或限制返回的字段。

本文提供了使用mongo shell中[db.collection.find()](https://docs.mongodb.com/v4.0/reference/method/db.collection.find/#db.collection.find)方法映射查询的案例。案例中使用的**inventory**集合数据可以通过下面的语句产生。

```javascript
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 } ] }
]);
```

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

如果没有特别指定[projection](https://docs.mongodb.com/manual/reference/glossary/#std-term-projection), [db.collection.find()](https://docs.mongodb.com/v4.0/reference/method/db.collection.find/#db.collection.find)方法将会返回匹配文档的所有字段。

下面的案例返回**inventory**集合中**status**等于\*\*"A"\*\*的文档的所有字段。

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

上述操作等价于下面的标准SQL:

```javascript
SELECT * from inventory WHERE status = "A"
```

## 仅返回指定字段和\_id字段

映射会返回在映射文档中显示设置为**1**的字段。

下面的案例返回所有检索到文档中**item, status, \_id**三个字段。

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

上述操作等价于下面的标准SQL:

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

## 去除\_id字段

可以通过在映射文档中&#x5C06;**\_id**字段设置为**0**来从结果集中去除 **\_id**字段，就像下面的例子:

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

上述操作等价于下面的标准SQL:

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

> Note:
>
> 除\_id字段外，不能在映射文档中同时使用包含和去除语句。

## 去除指定字段

可以使用映射来排除特定字段，而不是在匹配文档中列出要返回的字段。

下面的案例返回匹配文档中除**status** 和 **instock** 字段之外的所有字段：

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

> Note:
>
> 除\_id字段外，不能在映射文档中同时使用包含和去除语句。

## 返回嵌套文档中的指定字段

通过[点号](https://docs.mongodb.com/v4.0/core/document/#document-dot-notation)引用嵌套文档字段并且在映射文档中将该字段设置为**1**来实现返回嵌套文档中的指定字段。

下面的案例返回

* **\_id**字段(默认返回)
* **item**字段
* **status**字段
* 文档**size**中的**uom**字段

**uom**字段是**size**嵌套文档中的字段.

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

## 去除嵌套文档中的指定字段

通过[点号](https://docs.mongodb.com/v4.0/core/document/#document-dot-notation)引用嵌套文档字段并且在映射文档中将该字段设置为**0**来实现去除嵌套文档中的指定字段。

下面的案例返回匹配文档中除嵌套文档**size**中的**uom**字段外的所有字段。

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

## 映射数组中的嵌套文档的指定字段

通过使用[点号](https://docs.mongodb.com/v4.0/core/document/#document-dot-notation)来映射数组中嵌套文档的指定字段。

下面案例返回:

* **\_id**字段(默认返回)
* **item**字段
* **status**字段
* 数组字段**instock**中的嵌套文档中的**qty**字段

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

## 映射返回数组中指定的数组元素

对于数组字段，MongoDB 提供了以下用于操作数组的映射运算符:[$elemMatch](https://docs.mongodb.com/v4.0/reference/operator/projection/elemMatch/#proj._S_elemMatch),[$slice](https://docs.mongodb.com/v4.0/reference/operator/projection/slice/#proj._S_slice),[$](https://docs.mongodb.com/v4.0/reference/operator/projection/positional/#proj._S_)

下面的案例使用[$slice](https://docs.mongodb.com/manual/reference/operator/projection/slice/#mongodb-projection-proj.-slice)映射操作符返回数组字段**instock**中最后的元素:

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

[$elemMatch](https://docs.mongodb.com/manual/reference/operator/projection/elemMatch/#mongodb-projection-proj.-elemMatch),[$slice](https://docs.mongodb.com/manual/reference/operator/projection/slice/#mongodb-projection-proj.-slice),[$](https://docs.mongodb.com/manual/reference/operator/projection/positional/#mongodb-projection-proj.-)是将指定元素映射到返回数组中的唯一方法。

举个例子，不能使用数组下标来映射指定的数组元素。例如:\*\*{ "instock.0": 1 }\*\*映射不会用第一个元素来映射数组。

参考:

[Query Documents](https://docs.mongodb.com/v4.0/tutorial/query-documents/)

3323

原文链接：<https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/>

译者：张芷嘉


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mongoing.com/mongodb-crud-operations/query-documents/project-fields-to-return-from-query.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
