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