查询构建器
查询构建器属于 @aiao/rxdb-model 体系,不是单独发布的 @aiao/rxdb-query-builder* 包。
实际包结构如下:
@aiao/rxdb-model ← 核心模型、服务、schema 工具
@aiao/rxdb-model-angular ← Angular 组件
@aiao/rxdb-model-react ← React 组件 + Hook
@aiao/rxdb-model-vue ← Vue 组件 + Composable
架构
@aiao/rxdb-model
├── QueryBuilderService ← 查询构建状态管理
├── SchemaParser ← 从 EntityMetadata 解析字段
├── OperatorRegistry ← 操作符注册与筛选
├── Validation ← 规则合法性校验
└── Query Conversion ← RxDB RuleGroup 与 UI 状态互转
@aiao/rxdb-model-angular ← Angular Signal 组件
@aiao/rxdb-model-react ← React 组件 + Hook
@aiao/rxdb-model-vue ← Vue 组件 + Composable
安装
- npm
- Yarn
- pnpm
- Bun
# 核心工具
npm install @aiao/rxdb-model
# Angular
npm install @aiao/rxdb-model-angular
# React
npm install @aiao/rxdb-model-react
# Vue
npm install @aiao/rxdb-model-vue
# 核心工具
yarn add @aiao/rxdb-model
# Angular
yarn add @aiao/rxdb-model-angular
# React
yarn add @aiao/rxdb-model-react
# Vue
yarn add @aiao/rxdb-model-vue
# 核心工具
pnpm add @aiao/rxdb-model
# Angular
pnpm add @aiao/rxdb-model-angular
# React
pnpm add @aiao/rxdb-model-react
# Vue
pnpm add @aiao/rxdb-model-vue
# 核心工具
bun add @aiao/rxdb-model
# Angular
bun add @aiao/rxdb-model-angular
# React
bun add @aiao/rxdb-model-react
# Vue
bun add @aiao/rxdb-model-vue
核心概念
查询模型
查询条件由规则和规则组组成,支持任意嵌套:
import type { QueryBuilderRuleGroup } from '@aiao/rxdb-model';
const query: QueryBuilderRuleGroup<User> = {
id: 'root',
combinator: 'and',
rules: []
};
这里先记住三件事:
QueryBuilderRule<T>是带id的单条规则QueryBuilderRuleGroup<T>是带id的规则组toRxDBQuery()导出的是标准RuleGroup<T>,可以直接交给仓库查询 API 使用
字段元数据
import type { FieldMetadata } from '@aiao/rxdb-model';
const fields: FieldMetadata[] = [
{ name: 'name', displayName: '姓名', type: 'string' },
{ name: 'age', displayName: '年龄', type: 'number' },
{ name: 'active', displayName: '激活', type: 'boolean' }
];
字段元数据既可以手写,也可以从实体元数据自动生成。
QueryBuilderService
这是框架无关的核心状态管理服务:
import { createQueryBuilderService, type FieldMetadata } from '@aiao/rxdb-model';
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(service.getState().rootGroup.id);
service.rootGroup$.subscribe(group => console.log('查询:', group));
service.validation$.subscribe(result => console.log('校验:', result));
const query = service.toRxDBQuery();
service.fromRxDBQuery(query);
核心能力
addRule(parentId, rule):添加规则addGroup(parentId):添加分组updateRule(id, updates):更新规则remove(id):删除规则或分组moveItem(itemId, targetGroupId, targetIndex):拖拽排序toRxDBQuery()/fromRxDBQuery(query):导出与加载查询
配置选项
interface QueryBuilderConfig {
maxNestingLevel?: number;
enableHistory?: boolean;
maxHistoryLength?: number;
readonly?: boolean;
}
从 Entity 解析 Schema
通过 createSchemaFromEntity 自动从 RxDB 实体元数据生成字段列表:
import { createSchemaFromEntity } from '@aiao/rxdb-model';
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-model';
const registry = createOperatorRegistry({ useDefaultOperators: true });
registry.register({
key: 'fuzzy',
label: '模糊匹配',
valueType: 'single',
applicableTypes: ['string']
} as OperatorDefinition);
跨框架 API 对比
| 功能 | Angular | React | Vue |
|---|---|---|---|
| 主组件 | <rxdb-query-builder> | <QueryBuilder> | <QueryBuilder> |
| 状态管理 | 组件内置 Signal | useQueryBuilder hook | useQueryBuilder composable |
| 字段输入 | [fields] / [schema] | fields / schema prop | fields / schema prop |
| 查询输出 | (queryChange) output | onQueryChange callback | @query-change 事件 |
| 响应式 | Angular Signal | React State | Vue Ref/ShallowRef |
详细用法见各框架文档: