Можно ли преобразовать данные перед извлечением из mongoDB?

Допустим, у меня есть коллекция только с одним полем BlogText, Когда пользователь ищет слово и если это слово присутствует в BlogText, Я бы хотел:

  1. Получите только 10 слов перед совпавшим словом и 10 слов после совпавшего запроса, с последующим многоточием.
  2. Также хочу заменить Matched word от <b>Matched word</b>

Например, если искомый запрос 1500, я хочу получить следующее:

... has been the industry's standard dummy text ever since the <b>1500<b>s, when an unknown printer took a galley of type and ...

учитывая, что оригинальный текст в BlogText является:

Lorem Ipsum - просто фиктивный текст в полиграфии и вёрстке. Лорем Ипсум был стандартным манекенщиком в отрасли с 1500-х годов, когда неизвестный принтер взял набор шрифтов и скремблировал его, чтобы сделать книгу типовых образцов. Он пережил не только пять веков, но и скачок в электронном наборе текста, оставаясь практически неизменным. Он был популяризирован в 1960-х годах с выпуском листов Letraset, содержащих отрывки Lorem Ipsum, а в последнее время - с программным обеспечением для настольных издательских систем, таким как Aldus PageMaker, включая версии Lorem Ipsum.

Я знаю, что это можно сделать и на сервере, но я хочу избежать получения данных, которые мне не нужны (см. 1-й пункт).

1 ответ

Вы можете вернуть подстроку длинного текста, используя агрегацию.

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

db.collection.aggregate([
    { $match: { BlogText:/1500/ } },
    { $project: {
        match: {
            $let: {
                vars: { pos: { $indexOfCP: [ "$BlogText", "1500" ] }},
                in: { $concat: [
                    { $reduce: {
                        input: { $slice: [ 
                            { $split: [ 
                                { $substrCP: [ "$BlogText", 0, "$$pos" ] }, 
                                " " 
                            ]}, 
                            -10 
                        ]},
                        initialValue: "",
                        in: { $concat : [ "$$value", " ", "$$this" ] }
                    }},
                    { $reduce: {
                        input: { $slice: [ 
                            { $split: [ 
                                { $substrCP: [  "$BlogText", "$$pos", { $strLenCP: "$BlogText" } ] }, 
                                " " 
                            ]}, 
                            10 
                        ]},
                        initialValue: "",
                        in: { $concat : [ "$$value", " ", "$$this" ] }
                    }}            
                ]}
            }
        } 
    }}
]);
Другие вопросы по тегам