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

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

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

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

Пример

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

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

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

javascript[
  {
    "_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 из выборки:

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

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

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

Пример

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

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

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

javascript[
  {
    "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:

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

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

javascript[
  {
    "_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:

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

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

javascript[
  {
    "_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
  }
]

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

Задание 1

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

Задание 2

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