跳到主要内容

Query Builder

@aiao/rxdb-query-builder 是一个可视化查询条件构建器,支持 Angular、React 和 Vue 三端。用户通过拖拽和表单操作构建复杂的数据库查询条件,无需手写查询语法。

架构

@aiao/rxdb-query-builder          ← 核心库(框架无关)
├── QueryBuilderService ← BehaviorSubject 驱动的状态管理
├── SchemaParser ← 从 EntityMetadata 解析字段
├── OperatorRegistry ← 操作符注册与管理
├── ValidationService ← 规则校验
└── QueryConverter ← RxDB ↔ QB 查询格式转换

@aiao/rxdb-query-builder-angular ← Angular 组件(Signal-based)
@aiao/rxdb-query-builder-react ← React 组件 + Hook
@aiao/rxdb-query-builder-vue ← Vue 组件 + Composable

安装

# 核心库 + 框架包
npm install @aiao/rxdb-query-builder

# Angular
npm install @aiao/rxdb-query-builder-angular

# React
npm install @aiao/rxdb-query-builder-react

# Vue
npm install @aiao/rxdb-query-builder-vue

核心概念

数据模型

查询条件由规则 (Rule)规则组 (RuleGroup) 组成,支持任意嵌套:

// 规则:单个查询条件
interface QueryBuilderRule<T> {
id: string;
field: keyof T & string;
operator: string; // '=', '!=', 'contains', 'between' 等
value: unknown;
}

// 规则组:用 AND/OR 组合多个规则
interface QueryBuilderRuleGroup<T> {
id: string;
combinator: 'and' | 'or';
rules: Array<QueryBuilderRule<T> | QueryBuilderRuleGroup<T>>;
}

字段元数据

interface FieldMetadata {
name: string; // 字段路径,如 'name', 'orders.amount'
displayName: string; // 显示名称
type: PropertyType; // 'string' | 'number' | 'boolean' | 'date' | 'relation' | ...
required?: boolean;
nullable?: boolean;
enum?: unknown[]; // 枚举值列表
isRelation?: boolean;
relationTarget?: string;
relationKind?: '1:1' | '1:m' | 'm:1' | 'm:n';
relationFields?: FieldMetadata[]; // 关联实体的字段
}

默认操作符

操作符标签值类型适用字段类型
= / !=等于/不等于单值string, number, boolean, date
< / > / <= / >=比较单值number, date, string
contains / notContains包含/不包含单值string, array
startsWith / endsWith开头/结尾单值string
in / notIn在列表中数组string, number
between / notBetween范围内范围number, date
null / notNull为空/不为空可空字段
exists / notExists存在/不存在子查询关系字段

QueryBuilderService

核心状态管理服务,框架无关:

import { createQueryBuilderService, type FieldMetadata } from '@aiao/rxdb-query-builder';

const fields: FieldMetadata[] = [
{ name: 'name', displayName: '姓名', type: 'string' },
{ name: 'age', displayName: '年龄', type: 'number' },
{ name: 'active', displayName: '激活', type: 'boolean' }
];

const service = createQueryBuilderService<User>({
fields,
config: { maxNestingLevel: 3 }
});

// 操作
service.addRule(undefined, { field: 'name', operator: '=', value: '张三' });
service.addGroup(rootGroupId, 'or');
service.updateRule(ruleId, { value: '李四' });
service.remove(ruleId);
service.clear();

// 订阅状态
service.rootGroup$.subscribe(group => console.log('查询:', group));
service.validation$.subscribe(result => console.log('校验:', result));

// 导出/导入
const query = service.toRxDBQuery();
service.fromRxDBQuery(existingQuery);

配置选项

interface QueryBuilderConfig<T> {
maxNestingLevel?: number; // 最大嵌套层级,默认 5
enableHistory?: boolean; // 启用撤销/重做
maxHistoryLength?: number; // 历史记录上限,默认 50
customOperators?: OperatorDefinition[];
readonly?: boolean;
}

从 Entity 解析 Schema

通过 createSchemaFromEntity 自动从 RxDB 实体元数据生成字段列表:

import { createSchemaFromEntity } from '@aiao/rxdb-query-builder';
import { getEntityMetadata } from '@aiao/rxdb';

const metadata = getEntityMetadata(Todo);
const fields = createSchemaFromEntity(metadata, {
includeForeignKeys: false, // 默认排除外键
includeRelations: true // 包含关系字段
});

解析选项

interface SchemaParserOptions {
includeForeignKeys?: boolean; // 是否包含外键字段
includeComputedProperties?: boolean; // 是否包含计算属性
includeRelations?: boolean; // 是否包含关系字段
fieldFilter?: (field: FieldMetadata) => boolean; // 自定义过滤
displayNameGenerator?: (name: string) => string; // 自定义显示名称
}

自定义操作符

import { createOperatorRegistry, type OperatorDefinition } from '@aiao/rxdb-query-builder';

const registry = createOperatorRegistry({ useDefaultOperators: true });

// 注册自定义操作符
registry.register({
key: 'fuzzy',
label: '模糊匹配',
valueType: 'single',
applicableTypes: ['string']
});

// 在服务中使用
const service = createQueryBuilderService<User>({
fields,
operatorRegistry: registry
});

跨框架 API 对比

功能AngularReactVue
主组件<rxdb-query-builder><QueryBuilder><QueryBuilder>
状态管理组件内置 SignaluseQueryBuilder hookuseQueryBuilder composable
字段输入[fields] inputfields propfields option
查询输出(queryChange) outputonQueryChange callbackonQueryChange callback
响应式Angular SignalReact StateVue Ref/ShallowRef

详细用法见框架文档: