Можно ли преобразовать данные перед извлечением из mongoDB?
Допустим, у меня есть коллекция только с одним полем BlogText
, Когда пользователь ищет слово и если это слово присутствует в BlogText
, Я бы хотел:
- Получите только 10 слов перед совпавшим словом и 10 слов после совпавшего запроса, с последующим многоточием.
- Также хочу заменить
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" ] }
}}
]}
}
}
}}
]);