javascript - 如何在不影响应用程序性能的情况下搜索包含字符串数组中指定的任何子字符串的元素?
问题描述
给定架构:
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 中,然后只执行一次此 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);
解决方案
推荐阅读
- python - 如何在 Python 中使用 API 从 csv 文件中读取数据
- javascript - 如何使用 array.fill 创建对象数组?
- google-container-registry - 已超出 GKE 容器注册表配额
- javascript - 图表js不显示数据
- string - string.pack 和 string.unpack 的 Luajit 等价物?
- c# - 单击一次 Winform App - 异常强名称签名
- angular - 如何在 Firestore 中保存使用 Google 登录的数据
- jquery - 删除基于当前年份变量值的选择选项
- python - Python findall 正则表达式不起作用
- javascript - 如何显示月份和当前工作日的总工作日javascript