You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JS/TS中基于JSON对象创建高效服务端过滤器?

最优实现方案:将JSON过滤器转换为数据库层面查询

核心思路

直接把前端传入的JSON过滤规则转换为数据库的WHERE子句、ORDER BY子句,让数据库完成筛选和排序逻辑,彻底避免全量查询后内存过滤的资源浪费。

分步落地实现

1. 解析JSON过滤规则

针对你的JSON结构,拆解每个条件并映射到数据库字段:

  • type: "video" → 匹配数据库video_type字段等于video
  • date.gte/date.lt → 发布时间publish_date >= '2022-12-01' 且 < '2022-12-15'(注意统一用数据库能识别的日期格式,比如ISO标准的YYYY-MM-DD)
  • searchValue: "vlog" → 标题title LIKE 'vlog%'(前缀匹配,适合索引优化)
  • duration.lte: "240" → 视频时长duration <= 240
  • orderBy → 转换为ORDER BY子句,比如orderBy: "publish_date desc"对应ORDER BY publish_date DESC
  • features → 若为数组(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:25:21