在微服务开发中,经常遇到各种查询的需求,不同接口还有不同的查询方式,为了统一不同模型,不同筛选条件,动态筛选,复合条件筛选等各种场景查询方式,无需改代码支持不同场景下的查询需求,特定义了通用查询语言(GQL)。
以下是一些通用查询语言示例:
- 查询所有姓王的用户:
GET /api/users?filters=name%5E%3D%E7%8E%8B
其中filters的值是name^=王
的urlencode编码
以下为了方便理解,只展示filters编码前的内容
-
查询所有不姓王的用户:
name^!=王
-
查询所有姓王且年龄大于20岁的用户:
name^=王&ag>20
-
查询所有王姓和李姓且年龄大于30岁的用户:
(name^=王|name^=李)&ag>30
-
查询年龄正好是12,24,36岁的用户:
age IN[12,24,36]
-
查询20岁以上的用户,按年龄倒序排列:
GET /api/users?sort=-age&filters=age>20
-
查询20岁以上的用户,按年龄倒序排列, 每页5条,取第三页数据:
GET /api/users?sort=-age&skip=20&take=5&filters=age>20
-
查询20岁以上的用户,按年龄倒序排列, 每页5条,取第三页数据, 仅返回姓名和年龄两列数据:
GET /api/users?sort=-age&skip=20&take=5&fields=name,age&filters=age>20
以下是GQL的详细说明
排序
sort: [[+-]FieldName,]
排序示例:sort=+name,-date
分页
- skip:跳过多少条记录
- take:返回多少条记录
字段过滤
- fields:逗号分隔的字段名列表,如果指定了该参数,则只返回指定的字段,用来加速网络传输。
字段过滤示例:fields=name,age,date
筛选
筛选由逻辑运算和基础筛选单元构成,逻辑运算包括与,或,括号,基础筛选单元由字段名,比较符,值组成,若值中包含特殊字符,则需要urlencode。
筛选示例:filters=name^=王&age>20&job IN[aaa,bbb,ccc]
以下是所有的比较符:
=, *=, ^=, $=, !=, *!=, ^!=, $!=, >, <, >=, <=, IS NULL, IS NOT NULL, IN[]
-
各类型支持的比较符
- 字符型(等于,包含,开始于,结束于,不等于,不包含,不开始于,不结束于,为空,不为空, IN Array[])
- 数值型(等于,大于,小于,大于等于,小于等于,不等于,为空,不为空, IN Array[])
- 日期型(等于,大于,小于,大于等于,小于等于,不等于,为空,不为空, IN Array[])
- 布尔型(等于,不等于,为空,不为空, IN Array[])
- 子表关联出的列表(包含,不包含)
-
逻辑运算
- 与:&
- 或:|
- 括号:()
逻辑运算支持嵌套, 与优先于或,所以连续用或必须用括号包起来
标签:GQL,20,name,age,查询,filters,等于,通用,查询语言 From: https://www.cnblogs.com/xminn/p/17122161.html