Значения-массивы в MongoDB

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

javascript[
  {
    "name": "user1",
    "color": ["red"],
    "numbers": [1, 2, 3, 7]
  },
  {
    "name": "user2",
    "color": ["black", "red", "blue"],
    "numbers": [3, 5, 9]
  },
  {
    "name": "user3",
    "color": ["red", "green", "yellow"],
    "numbers": [1, 8, 9]
  },
]

Давайте посмотрим, какие в MongoDB есть операторы для работы с такими полями в виде массивов.

Оператор $all

Оператор $all выбирает документы, в которых значения поля это - массив, который содержит все указанные элементы:

javascriptlet cond = {color: {$all: ['red', 'green']}};
let res = await prods.find(cond).toArray();
console.log(res);

Оператор $size

Оператор $size выбирает документы, в которых переданное поле содержит массив указанного размера. Давайте, например выберем юзеров, у которых три любимых цвета:

javascriptlet cond = {color: {$size: 3}};
let res = await prods.find(cond).toArray();
console.log(res);

Оператор $elemMatch

Оператор $elemMatch выбирает документы, в которых поле содержит массив, и в этом массиве есть хотя бы один элемент, удовлетворяющий запросу.

Давайте для примера выберем всех юзеров, у которых есть хотя бы одно любимое число, попадающее в заданный диапазон:

javascriptlet cond = {numbers: {$elemMatch: {$gt: 3, $lt: 7}}};
let res = await prods.find(cond).toArray();
console.log(res);

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

Создайте следующую коллекцию clothes с одеждой:

javascript[
  {
    "name": "cloth1",
    "sizes": [1, 2],
    "colors": ["black", "blue"]
  },
  {
    "name": "cloth2",
    "sizes": [1, 2, 3],
    "colors": ["black", "white"]
  },
  {
    "name": "cloth3",
    "sizes": [2, 3, 4],
    "colors": ["green", "blue"]
  },
  {
    "name": "cloth4",
    "sizes": [4, 5, 6],
    "colors": ["black", "blue", "green"]
  },
];
Задание 1

Получите продукты, у которых три цвета.

Задание 2

Получите продукты, размер которых содержит значение из диапазона от 3 до 5.