С учетом схемы:
const dummySchema= new Schema({
title: { type: String},
category: { type: String},
delivery: { type: String},
...
});
module.exports = mongoose.model('Dummy', dummySchema);
и с учетом массивов:
var titleSplitedArray = ["word1","word2","word3","word4"...];
var categoriesArray = ["category1","category2","category3","category4"...];
var deliveryOptionsArray = ["delivery1","delivery2","delivery3","delivery4"...];
Как найти все записи (без получения дубликатов), где title
, category
, delivery
, содержит любую из этих подстрок, определенных внутри titleSplited
, categoriesArray
, deliveryOptionsArray
?
Этот код работает нормально:
results = await Promise.all(titleSplited.map((value) =>
getRecordsByQuery({title: { $regex: new RegExp('\\b' + value.toLowerCase() + '\\b', 'i') } } )
));
Однако я выполняю то же самое await Promise.all(titleSplited.map((value) => { // execute query //}))
Я понял, что с большим количеством записей, скажем, 100 000, я не могу выполнитьэтот код без проблем с производительностью, так как я выполняю как минимум 20 различных запросов (у меня больше параметров фильтра поиска для большего количества свойств в моей схеме).
Теперь, учитывая эту проблему с производительностью, я хочу создать бесконечную прокрутку дляотображая эти записи, однако я должен ограничить количество записей, которые я получу после выполнения запроса.Есть ли способ создать запрос мангусты для каждой опции поиска, затем добавить эти запросы в MasterQuery, который будет содержать остальные, а затем просто выполнить один раз этот вызов БД, не получая дубликатов, а затем ограничить результаты для реализации pagination / infiniteScroll?category
и delivery
- это простые проблемы, так как они представляют собой строку из одного слова, поэтому я могу использовать оператор $in
, но как мне решить проблему с заголовком и пагинацией?Что-то вроде:
var finalRecords = Post.find(
{$and:[
{ "title": /*contains substring inside array*/ },
{ "category": /*contains substring inside array*/ },
{ "delivery": {$in: deliveryOptionsArray} },
]}
)
.sort( "title" ).removeDuplicates().limit(25);