Tile38空间数据库操作命令之FSET、JSET

163 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情

FSET语法

FSET key id [XX] field value [field value ...]

设置id的一个或多个字段的值。值的类型是双精度浮点型。

示例

FSET fleet truck1 speed 16 wheels 8

我们对fleet下面的truck1设置了两个字段值;一个是speed为16,一个是wheels为8。

如果对一个不存在的id进行设置,那么会抛出错误。我们可以使用参数XX来避免程序抛出错误。

FSET fleet trunk100 speed 90

如果trunk100不存在,那么上面的命令就会发生错误,为了避免这个错误,我们可以用下面这个命令:

FSET fleet trunk100 XX speed 90

这样的话,即使trunk100这个id不存在,执行这个命令也不会报错,当然也不会成功,相当于啥也没做。

JSET语法

JSET key id path value [RAW|STR]

JSET的作用就是在一个JSON文档中设置一个值。

示例

通过JSET命令,我们可以构建一个JSON文档

127.0.0.1:9851> JSET user 901 name Tom
{"ok":true,"elapsed":"64.751µs"}
127.0.0.1:9851> JGET user 901
{"ok":true,"value":"{"name":"Tom"}","elapsed":"17.864µs"}

除了上面这样针对一个简单字段创建JSON文档,我们还可以针对更深层次的path进行设置:

127.0.0.1:9851> JSET user 901 name.first Tom
{"ok":true,"elapsed":"70.712µs"}
127.0.0.1:9851> JGET user 901
{"ok":true,"value":"{"name":{"first":"Tom"}}","elapsed":"21.651µs"}
127.0.0.1:9851> JSET user 901 name.last Anderson
{"ok":true,"elapsed":"53.741µs"}
127.0.0.1:9851> JGET user 901
{"ok":true,"value":"{"name":{"first":"Tom","last":"Anderson"}}","elapsed":"17.704µs"}

上面的示例就是通过name.firstname.last的方式来实现深层次的JSON文档。

  • RAW

    SET linestrings 1 OBJECT {"type": "LineString", "coordinates": [[0, 0], [1, 1]]}
    JSET linestrings 1 coordinates.-1 [2,2] RAW
    JGET linestrings 1
    > {"type":"LineString","coordinates":[[0,0],[1,1],[2,2]]}
    

    RAW允许将值解释为序列化的JSON对象。上面的JSET命令作用就是给coordinates数组的最后加上一个元素[2,2]

  • STR

    JSET test 1 properties.bool true
    JGET test 1 properties.bool
    > {"value":true}
    ​
    JSET test 1 properties.bool true STR
    JGET test 1 properties.bool
    > {"value":"true"}
    

    如果没有在命令中加上STR,那么properties.bool的值就是true;加上STR就把properties.bool改变成了字符串的"true",而不是一个真正的布尔值。针对于整型数值,如果有需要的话,也可以通过添加STR的方式,将它们改变成字符串类型。

需要补充介绍的另外两个命令JGET、JDEL:

  • JGET语法:

    JGET key id path [RAW]
    

    从 JSON 文档中获取值。

    JSET user 901 name Tom
    JGET user 901
    > {"name":"Tom"}
    ​
    JSET user 901 name.first Tom
    JSET user 901 name.last Anderson
    JGET user 901 name.last
    > {"ok":true,"value":"Anderson","elapsed":"12.724µs"}
    

    我们既可以通过JGET key id获取整个JSON文档,也可以通过JGET key id path获取指定的JSON文档中的字段值。

  • JDEL语法:

    JDEL key id path
    

    JDEL的作用就是从JSON文档中删除目标字段及相关值。

    JSET user 901 name.first Tom
    JSET user 901 name.last Anderson
    JGET user 901
    > {"name":{"first":"Tom","last":"Anderson"}}
    ​
    JDEL user 901 name.last
    JGET user 901
    > {"name":{"first":"Tom"}}
    

    在上面示例中,我们通过JSET产生了两个值,后续通过JDEL命令删掉了其中的name.last