Проекция документов в 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.