Как искать элементы, которые содержат любую подстроку, указанную в массиве строк, не рискуя при этом производительностью приложения? - PullRequest
0 голосов
/ 28 января 2019

С учетом схемы:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...