# Проекция документов в MongoDB

Документ может иметь множество полей, но не все эти поля нам могут быть нужны и важны при запросе. В этом случае мы можем включить в выборку только нужные поля, использовав проекцию.

Проекция задается с помощью метода `project`. Этот метод параметром принимает объект, в котором ключами будут поля, а значениями - нули или единицы. Если какое-то поле имеет значение `0`, то это поле не попадет в выборку, а если значение `1`, то попадет.

При этом поле `_id` ведет себя по особому - если его явно не исключить, то оно попадет в выборку. Давайте попробуем на практике.

## Пример

Найдем всех юзеров и в итоговую выборку возьмем только поле `name` (а поле `_id` пролезет само):

`let proj = {name: 1}; let res = await coll.find().project(proj).toArray(); console.log(res);`

Результат выполнения кода:

`[ { "_id": new ObjectId("..."), "name": "user1" }, { "_id": new ObjectId("..."), "name": "user2" }, { "_id": new ObjectId("..."), "name": "user3" }, { "_id": new ObjectId("..."), "name": "user4" }, { "_id": new ObjectId("..."), "name": "user5" }, { "_id": new ObjectId("..."), "name": "user6" } ]`

## Пример

Давайте явно исключим поле `_id` из выборки:

`let proj = {name: 1, _id: 0}; let res = await coll.find().project(proj).toArray(); console.log(res);`

Результат выполнения кода:

`[ { "name": "user1" }, { "name": "user2" }, { "name": "user3" }, { "name": "user4" }, { "name": "user5" }, { "name": "user6" } ]`

## Пример

А теперь в итоговую выборку возьмем поля `name` и `age`:

`let proj = {name: 1, age: 1, _id: 0}; let res = await coll.find().project(proj).toArray(); console.log(res);`

Результат выполнения кода:

`[ { "name": "user1", "age": 25 }, { "name": "user2", "age": 25 }, { "name": "user3", "age": 26 }, { "name": "user4", "age": 26 }, { "name": "user5", "age": 26 }, { "name": "user6", "age": 27 } ]`

## Пример

А теперь возьмем все поля, кроме `age`:

`let proj = {age: 0}; let res = await coll.find().project(proj).toArray(); console.log(res);`

Результат выполнения кода:

`[ { "_id": new ObjectId("..."), "name": "user1", "salary": 300 }, { "_id": new ObjectId("..."), "name": "user2", "salary": 400 }, { "_id": new ObjectId("..."), "name": "user3", "salary": 400 }, { "_id": new ObjectId("..."), "name": "user4", "salary": 500 }, { "_id": new ObjectId("..."), "name": "user5", "salary": 500 }, { "_id": new ObjectId("..."), "name": "user6", "salary": 500 } ]`

## Пример

А теперь возьмем все поля, кроме `name` и `age`:

`let proj = {name: 0, age: 0}; let res = await coll.find().project(proj).toArray(); console.log(res);`

Результат выполнения кода:

`[ { "_id": new ObjectId("..."), "salary": 300 }, { "_id": new ObjectId("..."), "salary": 400 }, { "_id": new ObjectId("..."), "salary": 400 }, { "_id": new ObjectId("..."), "salary": 500 }, { "_id": new ObjectId("..."), "salary": 500 }, { "_id": new ObjectId("..."), "salary": 500 } ]`

## Практические задачи

Получите все продукты так, чтобы в выборке были только поля `name` и `cost`.

Получите все продукты так, чтобы в выборке были все поля, кроме `_id`.

← →
↑