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

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

[ { "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 выбирает документы, в которых значения поля это - массив, который содержит все указанные элементы:

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

Оператор $size

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

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

Оператор $elemMatch

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

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

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

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

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

[ { "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"] }, ];

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

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