# 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

暂未支持排序、区间分组等语法。