Как я могу использовать агрегацию MongoDB для условного сопоставления полей из формы поиска, которые не равны нулю? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть большая поисковая форма на моем веб-сайте с 10 + дополнительными параметрами поиска.Мне нужно вернуть все документы из MongoDB, которые соответствуют тем полям формы, которые присутствуют в каждом поиске.

Один из способов достижения желаемых результатов - написать оператор if if для каждой возможной комбинации непустых полей поиска по порядку, но должен быть лучший способ.

    ex.
    const sQ = new TMDLs(request.body);


    }else if(sQ.Basin && sQ.Water_Body_Name && sQ.Water_Body_ID){
        searchData = await TMDLs.aggregate([
            { $match: { $text: {$search: `\"${sQ.Basin}\"`}}},
            { $match: { Water_Body_Name: sQ.Water_Body_Name}},
            { $match: { Water_Body_ID: sQ.Water_Body_ID}}

        ]);
    }else if(sQ.Basin && sQ.Water_Body_Name){
        searchData = await TMDLs.aggregate([
            { $match: { Basin: sQ.Basin }},
            { $match: {Water_Body_Name: sQ.Water_Body_Name}}
        ]);

Кодвыше работает, но нецелесообразно пробовать каждую комбинацию непустых параметров поиска.Мне нужны результаты агрегации, чтобы вернуть все записи, которые соответствуют непустым полям поиска.

Я пробовал $ ifNull, $ существующие, $ group, $ project и многие другие условные операторы, но я не могу найтивсе, что решает эту проблему.

1 Ответ

0 голосов
/ 03 июля 2019

Одним из способов решения этой проблемы было бы иметь список всех поисков и отфильтровать ненулевые:

const criteria = [
            sQ.Basin != null && { $text: {$search: `\"${sQ.Basin}\"`}}},
            sQ.Water_Body_Name != null && { Water_Body_Name: sQ.Water_Body_Name}},
            sQ.Water_Body_ID != null && { $match: { Water_Body_ID: sQ.Water_Body_ID}}
            sQ.Basin != null && { Basin: sQ.Basin },
            ...
].filter(Boolean)

После того, как у вас есть эти критерии, вы можете использовать $andобъединить их в одну $match стадию (что эквивалентно нескольким последовательным $match стадиям).

TMDLs.aggregate([
  {$match: {$and: criteria}},
  ...
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...