首页 > 解决方案 > 如何在不影响应用程序性能的情况下搜索包含字符串数组中指定的任何子字符串的元素?

问题描述

给定架构:

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中定义的任何这些子字符串? titleSplitedcategoriesArraydeliveryOptionsArray

此代码工作正常:

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 中,然后只执行一次此 DB 调用,而不会重复,然后限制分页/无限滚动的实现结果? 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);

标签: javascriptnode.jsdatabaseperformancemongoose

解决方案


推荐阅读