Ну, можно это все немного обобщить - уберем тьму if'ов
Т.е. у нас есть набор фильтров с произвольными параметрами (для каждого фильтра свой)
А на выходе мы ходим получить итоговый запрос к БД
Можно правила обработки фильтров описать в виде объекта, где ключ - это имя фильтра, а значение - коллбэк, который возвращает элемент этого pipeline.
Что-то типа
const filters = {
groups: (groups) => ({
$match: {
groups: {
$all: groups
}
}
})
...
}
Далее проходимся циклом по всем заданным фильтрам, последовательно применяя коллбэки из объекта.