У меня есть объект ученика
[
{
"_id": "60f18b0120e927a4bf5a3654",
"balance": 0,
"groups": [
"id1",
"id2",
"id3"
],
"name": "Хабиб",
"surname": "Нурмагомедов",
"midname": "Абдулманапович",
"gender": "Мужской",
"age": "2005-05-06T00:00:00.000Z"
}
]
И мне нужно сделать что-то вроде
filter pipeline
По каким полям необходимо фильтровать:
1)
balance
- Отрицательный, положительный или и то, и другое
2)
gender
- Мужской, Женский или и то, и другое
3)
age
- Тут должен быть массив
$or
условий, допустим, мы ищем людей возрастом 13, 15 и 19 лет. Возраст хранится как дата рождения в формате ISO, а алгоритм поиска людей нужного возраста работает так:
если мы ищем человека, чей возраст равен 16, значит его
age
должен быть
$gte: /*какая-то дата*/
и
$lt: /*какая-то дата*/
(К дате применимы операторы >, <, = и т.д)
4)
groups
- у ученика в примере всего три группы -
id1, id2, id3, нужно отфильтровать учеников у которых в поле groups имеются группы из массива id, который мы получаем как фильтр.
Вот пример: у нас есть три ученика с разным списком групп
{
groups: ["id1", "id3", "id8"]
},
{
groups: ["id1", "id2", "id5"]
},
{
groups: ["id6", "id7", "id8"]
}
И на вход мы получаем такой фильтр:
["id1", "id2"]
И как результат мы получаем:
{
groups: ["id1", "id3", "id8"]
},
{
groups: ["id1", "id2", "id5"]
}
В общем у ученика в массиве групп должен быть хотя бы 1 элемент из фильтра. Я что-то слышал про
$all
, но мне бы хотя бы пока объединить первый, второй и третий фильтры...
Причём, если какого-то фильтра нет, то нужно чтобы он просто не применялся (я когда в $or сувал пустой массив без фильтров, он выдавал мне ошибку, что в or не может быть пустого массива)
Помогите пожалуйста.