如何在JS/TS中基于JSON对象创建高效服务端过滤器?
最优实现方案:将JSON过滤器转换为数据库层面查询
核心思路
直接把前端传入的JSON过滤规则转换为数据库的WHERE子句、ORDER BY子句,让数据库完成筛选和排序逻辑,彻底避免全量查询后内存过滤的资源浪费。
分步落地实现
1. 解析JSON过滤规则
针对你的JSON结构,拆解每个条件并映射到数据库字段:
type: "video"→ 匹配数据库video_type字段等于videodate.gte/date.lt→ 发布时间publish_date>= '2022-12-01' 且 < '2022-12-15'(注意统一用数据库能识别的日期格式,比如ISO标准的YYYY-MM-DD)searchValue: "vlog"→ 标题titleLIKE 'vlog%'(前缀匹配,适合索引优化)duration.lte: "240"→ 视频时长duration<= 240orderBy→ 转换为ORDER BY子句,比如orderBy: "publish_date desc"对应ORDER BY publish_date DESCfeatures→ 若为数组(如features: ["4k", "hdr"]),则用数据库对应语法,比如PostgreSQL的features @> ARRAY['4k','hdr'],MySQL的JSON_CONTAINS(features, '["4k","hdr"]')
2. 构建参数化查询
绝对禁止字符串拼接,用参数化查询防止SQL注入,同时让数据库缓存查询计划。以PostgreSQL为例,生成的参数化SQL大致如下:
SELECT * FROM videos WHERE video_type = $1 AND publish_date >= $2 AND publish_date < $3 AND title LIKE $4 AND duration <= $5 ORDER BY publish_date DESC;
对应参数绑定:
- $1: 'video'
- $2: '2022-12-01'
- $3: '2022-12-15'
- $4: 'vlog%'
- $5: 240
3. 数据库索引优化
为过滤字段创建复合索引,大幅提升查询效率:
- 针对
video_type+publish_date+duration创建复合索引:CREATE INDEX idx_videos_type_date_duration ON videos (video_type, publish_date, duration); - 针对标题前缀查询,MySQL可创建前缀索引,PostgreSQL用普通B-tree索引即可支持前缀LIKE扫描:
-- MySQL 前缀索引 CREATE INDEX idx_videos_title_prefix ON videos (title(5));
4. 动态扩展其他参数
orderBy:解析字段名和排序方向,先校验字段合法性(只允许publish_date、duration等业务允许的字段),再生成对应的ORDER BY语句。features:推荐用数据库的数组或JSON类型存储,配合原生查询语法实现高效匹配。
关键注意事项
- 日期格式统一:确保JSON中的日期字符串能被数据库正确解析,优先用
YYYY-MM-DD格式避免歧义。 - 参数校验:转换前校验每个过滤参数的合法性,比如
duration必须是正整数,date必须是有效日期。 - 配合分页:如果数据量较大,加上
LIMIT/OFFSET或游标分页,进一步减少数据传输量。
内容的提问来源于stack exchange,提问作者oSobaMask
相关产品推荐
相关产品推荐

