Grapeoff
@Grapeoff
В чём концепция...?

Как сформировать запрос к MongoDB, чтобы отфильтровать сразу по нескольким полям?

У меня есть объект ученика
[
  {
    "_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 не может быть пустого массива)

Помогите пожалуйста.
  • Вопрос задан
  • 317 просмотров
Решения вопроса 1
Grapeoff
@Grapeoff Автор вопроса
В чём концепция...?
Окей, я нашел решение - в MongoDB Compass есть конструктор пайплайнов aggregate
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы