# nosql支持
easysql针对ElasticSearch,MongoDB等nosql数据库,添加了有限的支持,支持把类sql的dsl翻译为nosql的查询语句,以期帮助用户降低nosql的使用成本,目前,这部分api是实验性的。
# MongoDB
我们可以使用对Select
类的扩展方法toMongoDsl
来生成MongoDB的查询语句:
val s = (select (user.id, user.name)
from user
where user.id > 1 && user.name === "x"
orderBy (user.id.asc, user.name.desc)
limit 10 offset 100)
val dsl = s.toMongoDsl
生成的查询语句如下:
db.user.find({$and: [{"id": {$gt: 1}}, {"name": "x"}]}, {"id": 1, "name": 1})
.sort({"id": 1, "name": -1})
.limit(10)
.skip(100)
from会被翻译为db.tableName。
select会被翻译为find中的第二项参数。
orderBy会被翻译为sort列表。
limit和offset会被翻译为limit和skip。
where和其中的条件会被翻译为find的第一项参数,支持的运算符如下:
运算符名称 | 对应MongoDB运算符 |
---|---|
=== | |
<> | $ne |
> | $gt |
>= | $gte |
< | $lt |
<= | $lte |
&& | $and |
|| | $or |
in | $in |
notIn | $nin |
暂未支持聚合语法。
# ElasticSearch
我们可以使用对Select
类的扩展方法toEsDsl
来生成ElasticSearch的查询语句:
val s = (select (user.id, user.name)
from user
where user.id > 1 && user.name === "xxx"
limit 10 offset 100)
val dsl = s.toEsDsl
生成的查询语句如下:
GET /user/_search {
"from": 100,
"size": 10,
"_source": [id, name],
"query": {
"bool": {
"must" [
"range": {
"id": {
"gt": 1
},
},
"term": {
"name": "xxx"
},
],
},
},
}
from会被翻译为GET /tableName/_search。
select会被翻译为_source列表。
limit和offset会被翻译为size和from。
where会被翻译为query,支持的运算符如下:
运算符名称 | 对应ElasticSearch运算符 |
---|---|
=== | term |
like | match |
<> | must_not |
notLike | must_not match |
> | range gt |
>= | range gte |
< | range lt |
<= | range lte |
&& | must |
|| | should |
支持聚合和分组语法:
val s = (select (sum(user.id) as "c1", count(user.name) as "c2")
from user
groupBy (user.id, user.name))
val dsl = s.toEsDsl
生成的查询语句如下:
GET /user/_search {
"query": {
"match_all": {}
},
"aggregations": {
"id_group": {
"terms": {
"field": "id"
},
"aggregations": {
"name_group": {
"terms": {
"field": "name"
},
"aggregations": {
"c1": {
"sum": {
"field": "id"
},
},
"c2": {
"cardinality": {
"field": "name"
},
},
},
},
},
},
},
}
查询中的聚合函数字段,需要使用as
起别名。
支持的聚合函数如下:
聚合函数名称 | ElasticSearch聚合 |
---|---|
count | value_count |
countDistinct | cardinality |
sum | sum |
avg | avg |
max | max |
min | min |
暂未支持排序、区间分组等语法。
← 数据库交互