Документ может иметь множество полей, но не все эти поля нам могут быть нужны и важны при запросе. В этом случае мы можем включить в выборку только нужные поля, использовав проекцию.
Проекция задается с помощью метода
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
.