Агрегация MongoDB - группировка результатов по тексту - PullRequest
1 голос
/ 22 мая 2019

У меня есть объекты следующего типа:

"name":string,
"title": string,
"body": string

Мне нужно выполнить запрос агрегации, который ищет объекты, содержащие определенный текст в одном из полей. Результаты должны быть сгруппированы по следующим правилам:

  1. Первые объекты, в названии которых содержится текст.
  2. Затем объекты, заголовок которых содержит текст.
  3. Затем объекты, в теле которых содержится текст.

Первый этап агрегирования выглядит следующим образом:

"$match" : {
                "$or" : [
                    {
                        "name" : /.*hellow world.*/i
                    }, 
                    {
                        "title" : /.*hellow world.*/i
                    }, 
                    {
                        "body" : /.*hellow world.*/i
                    }
                ]
            }
  • Также я использую пейджинг.
  • Запрос запрашивается с сервера node.js.

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

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

1 Ответ

2 голосов
/ 22 мая 2019

Вы можете использовать $ фасет , чтобы применить свои критерии отдельно, а затем запустить $ concatArrays , чтобы объединить результаты:

db.col.aggregate([
    {
        $facet: {
            name: [ { $match: { "name" : /.*hello world.*/i } } ],
            title: [ { $match: { "title" : /.*hello world.*/i } } ],
            body: [ { $match: { "body" : /.*hello world.*/i } } ],
        }
    },
    {
        $project: {
            data: {
                $concatArrays: [ "$name", "$title", "$body" ]
            }
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...