api-filtering-sorting
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseAPI Filtering & Sorting
API过滤与排序
Build flexible filtering and sorting systems that handle complex queries efficiently.
构建可高效处理复杂查询的灵活过滤与排序系统。
Query Parameter Syntax
查询参数语法
GET /products?category=electronics&price[gte]=100&price[lte]=500&sort=-price,nameGET /products?category=electronics&price[gte]=100&price[lte]=500&sort=-price,nameImplementation (Node.js)
实现示例(Node.js)
javascript
const allowedFilters = ['category', 'status', 'price', 'createdAt'];
const allowedSorts = ['name', 'price', 'createdAt'];
app.get('/products', async (req, res) => {
const filter = {};
const sort = {};
// Parse filters
for (const [key, value] of Object.entries(req.query)) {
if (key === 'sort') continue;
const match = key.match(/^(\w+)\[(\w+)\]$/);
if (match) {
const [, field, operator] = match;
if (!allowedFilters.includes(field)) continue;
filter[field] = { [`$${operator}`]: parseValue(value) };
} else if (allowedFilters.includes(key)) {
filter[key] = value;
}
}
// Parse sort
if (req.query.sort) {
for (const field of req.query.sort.split(',')) {
const direction = field.startsWith('-') ? -1 : 1;
const name = field.replace(/^-/, '');
if (allowedSorts.includes(name)) sort[name] = direction;
}
}
const products = await Product.find(filter).sort(sort);
res.json({ data: products });
});
function parseValue(value) {
if (value === 'true') return true;
if (value === 'false') return false;
if (!isNaN(value)) return Number(value);
return value;
}javascript
const allowedFilters = ['category', 'status', 'price', 'createdAt'];
const allowedSorts = ['name', 'price', 'createdAt'];
app.get('/products', async (req, res) => {
const filter = {};
const sort = {};
// Parse filters
for (const [key, value] of Object.entries(req.query)) {
if (key === 'sort') continue;
const match = key.match(/^(\w+)\[(\w+)\]$/);
if (match) {
const [, field, operator] = match;
if (!allowedFilters.includes(field)) continue;
filter[field] = { [`$${operator}`]: parseValue(value) };
} else if (allowedFilters.includes(key)) {
filter[key] = value;
}
}
// Parse sort
if (req.query.sort) {
for (const field of req.query.sort.split(',')) {
const direction = field.startsWith('-') ? -1 : 1;
const name = field.replace(/^-/, '');
if (allowedSorts.includes(name)) sort[name] = direction;
}
}
const products = await Product.find(filter).sort(sort);
res.json({ data: products });
});
function parseValue(value) {
if (value === 'true') return true;
if (value === 'false') return false;
if (!isNaN(value)) return Number(value);
return value;
}Filter Operators
过滤操作符
| Operator | Meaning | Example |
|---|---|---|
| eq | Equals | |
| ne | Not equals | |
| gt/gte | Greater than | |
| lt/lte | Less than | |
| in | In array | |
| like | Contains | |
| 操作符 | 含义 | 示例 |
|---|---|---|
| eq | 等于 | |
| ne | 不等于 | |
| gt/gte | 大于/大于等于 | |
| lt/lte | 小于/小于等于 | |
| in | 在数组范围内 | |
| like | 包含 | |
Security
安全注意事项
- Whitelist allowed filter fields
- Validate input types per field
- Index frequently-filtered columns
- Limit query complexity
- Prevent SQL/NoSQL injection
- 白名单允许的过滤字段
- 按字段验证输入类型
- 为频繁过滤的列创建索引
- 限制查询复杂度
- 防止SQL/NoSQL注入
Best Practices
最佳实践
- Support common operators
- Cache filter option lists
- Monitor query performance
- Provide sensible defaults
- 支持常用操作符
- 缓存过滤选项列表
- 监控查询性能
- 提供合理的默认值