XIKEW.COM - 实用教程 - RedisJSON 学习手册四 - 实用教程,Redis,RedisJSON,JSON,Array,Object,Module - 这次我们来学习数组指令(用来对于path路径下为数组的值进行处)、对象指令及模组指令

RedisJSON 学习手册四
REDIS REDISJSON JSON 1/4/2022 9:29:21 PM 阅读:300

这次我们来学习数组指令(用来对于path路径下为数组的值进行处)、对象指令及模组指令 关键字: Redis,RedisJSON,JSON,Array,Object,Module

数组指令

JSON.ARRAPPEND

版本:1.0.0+ 复杂度:O(1)当路径计算为单个值时,O(N)当 path 计算为多个值时,其中 N 是键的数量。

语法:

JSON.ARRAPPEND <key> <path> <json> [json ...]

说明:<json> 值追加到 path 路径下的值类型为数组的最后一位。

返回值: 数字数组,对于每个路径,表示字符串的新长度,如果匹配的 JSON 值不是数组,则表示空元素。

例子:

127.0.0.1:6379> JSON.SET doc $ '{"a":[1], "nested": {"a": [1,2]}, "nested2": {"a": 42}}'
OK
127.0.0.1:6379> JSON.ARRAPPEND doc $..a 3 4
1) (integer) 3
2) (integer) 4
3) (nil)
127.0.0.1:6379> JSON.GET doc $
"[{\"a\":[1,3,4],\"nested\":{\"a\":[1,2,3,4]},\"nested2\":{\"a\":42}}]"

JSON.ARRINDEX

版本:1.0.0+ 复杂度:O(N)当path值为单个数组时N表示为数组长度,当path值为多个数组时则N表键的数量。

语法:

JSON.ARRINDEX <key> <path> <json-scalar> [start [stop]]

说明: 搜索数组中标量 JSON 值的第一次出现。 可选参数 [start] (默认值为0) 和 [stop] (默认值为0,意思是包含最后一个元素) 指定要搜索的数组的切片,负值被解释为从末尾开始。

返回值: 数字数组,对于每个路径,返回的数字表示搜索的值在数组中第一次出现的标量值,负数则表示在数组内找不到,如果匹配的 JSON 值不是数组,则表示null。

例子:

127.0.0.1:6379> JSON.SET doc $ '{"a":[1,2,3,2], "nested": {"a": [3,4]}}'
OK
127.0.0.1:6379> JSON.ARRINDEX doc $..a 2
1) (integer) 1
2) (integer) -1
127.0.0.1:6379> JSON.SET doc $ '{"a":[1,2,3,2], "nested": {"a": false}}'
OK
127.0.0.1:6379> JSON.ARRINDEX doc $..a 2
1) (integer) 1
2) (nil)

JSON.ARRINSERT

版本:1.0.0+ 复杂度:O(N)当path值为单个数组时N表示为数组长度,当path值为多个数组时则N表键的数量。

语法:

JSON.ARRINSERT <key> <path> <index> <json> [json ...]

说明:<json> 值插入到 <path> 对应的数组的 <index> 位置的前面。索引必须在数组的范围内。<index>0 则表示加到数组的第一个位置,负索引值被解释为从末尾开始。

返回值: 数字数组,对于每个路径,表示字符串的新长度,如果匹配的 JSON 值不是数组,则表示空元素。

例子:

127.0.0.1:6379> JSON.SET doc $ '{"a":[3], "nested": {"a": [3,4]}}'
OK
127.0.0.1:6379> JSON.ARRINSERT doc $..a 0 1 2
1) (integer) 3
2) (integer) 4
127.0.0.1:6379> JSON.GET doc $
"[{"a":[1,3,4],"nested":{"a":[1,2,3,4]},"nested2":{"a":42}}]"
127.0.0.1:6379> JSON.SET doc $ '{"a":[1,2,3,2], "nested": {"a": false}}'
OK
127.0.0.1:6379> JSON.ARRINSERT doc $..a 0 1 2
1) (integer) 6
2) (nil)

JSON.ARRLEN

版本:1.0.0+ 复杂度:O(1)当path值为单个值时,当path值为多个值时则N表键的数量。

语法:

JSON.ARRLEN <key> [path]

说明: 返回指定的<path>下的<key>对应的数组的长度 不提供<path>时默认为根目录,<path><key>都不提供时返回null

返回值: 整数数组,确切的说返回对应的数组长度,当无法匹配到数组时返回null

例子:

127.0.0.1:6379> JSON.SET doc $ '{"a":[3], "nested": {"a": [3,4]}}'
OK
127.0.0.1:6379> JSON.ARRLEN doc $..a
1) (integer) 1
2) (integer) 2
127.0.0.1:6379> JSON.SET doc $ '{"a":[1,2,3,2], "nested": {"a": false}}'
OK
127.0.0.1:6379> JSON.ARRLEN doc $..a
1) (integer) 4
2) (nil)

JSON.ARRPOP

版本:1.0.0+ 复杂度:O(N)当 path 被评估为单个值时,其中 N 是数组的大小并且指定的索引不是最后一个元素,O(1)当 path 被评估为单个值并且指定的索引是最后一个元素时,O(N) 当 path 被评估为多个值时,其中 N 被视为 键的大小

语法:

JSON.ARRPOP <key> [path [index]]

说明: 从数组中的索引中删除并返回元素。 <path> 未被提供时默认为根目录,<index> 数组中开始出栈的位置(默认为-1,最后的位置),超出范围的索引四舍五入到它们各自的数组末端,空数组会产生 null

返回值: 出栈值的数组,确切的说是出栈的JSON值,或者在非数组情况下返回null

例子:

127.0.0.1:6379> JSON.SET doc $ '{"a":[3], "nested": {"a": [3,4]}}'
OK
127.0.0.1:6379> JSON.ARRPOP doc $..a
1) "3"
2) "4"
127.0.0.1:6379> JSON.GET doc $
"[{\"a\":[],\"nested\":{\"a\":[3]}}]"
127.0.0.1:6379> JSON.SET doc $ '{"a":["foo", "bar"], "nested": {"a": false}, "nested2": {"a":[]}}'
OK
127.0.0.1:6379> JSON.ARRPOP doc $..a
1) "\"bar\""
2) (nil)
3) (nil)

JSON.ARRTRIM

版本:1.0.0+ 复杂度:O(N)当path值为单个数组时N表示为数组长度,当path值为多个数组时则N表键的数量。

语法:

JSON.ARRTRIM <key> <path> <start> <stop>

说明: 修剪数组,使其仅包含指定的包含范围的元素。 此命令非常宽容,将它与超出范围的索引一起使用不会产生错误。如果 <start> 大于数组的大小或 <start> > <stop>,结果将是一个空数组。如果 <start> < 0 那么它将被视为 0。如果 <stop> 大于数组的末尾,它将被视为其中的最后一个元素。

返回值: 数字数组,对于每个路径,表示字符串的新长度,如果匹配的 JSON 值不是数组,则表示空元素。

例子:

127.0.0.1:6379> JSON.ARRTRIM doc $..a 1 1
1) (integer) 0
2) (integer) 1
127.0.0.1:6379> JSON.GET doc $
"[{\"a\":[],\"nested\":{\"a\":[4]}}]"
127.0.0.1:6379> JSON.SET doc $ '{"a":[1,2,3,2], "nested": {"a": false}}'
OK
127.0.0.1:6379> JSON.ARRTRIM doc $..a 1 1
1) (integer) 1
2) (nil)

对象指令

JSON.OBJKEYS

版本:1.0.0+ 复杂度:O(N)当path值为单个值时N为keys对应的对象数量,当path值为多个值时则N表键的大小。

语法:

JSON.OBJKEYS <key> [path]

说明: 返回由 path 引用的对象中的键。 [path] 未提供时默认为根目录,当<key>[path]都不存在时返回null

返回值: 包含键的数组,准确的说匹配path的对象的键数组,当无匹配内容时返回null

例子:

127.0.0.1:6379> JSON.SET doc $ '{"a":[3], "nested": {"a": {"b":2, "c": 1}}}'
OK
127.0.0.1:6379> JSON.OBJKEYS doc $..a
1) (nil)
2) 1) "b"
   2) "c"

JSON.OBJLEN

版本:1.0.0+ 复杂度:O(1)当path值为单个值时,当path值为多个值时则N表键的大小。

语法:

JSON.OBJLEN <key> [path]

说明: [path] 对应的 <key> 的 JSON对象。 [path] 未提供则默认为根目录,无匹配结果则返回null。

返回值: 整数,确切的说是对象中的键数。

例子:

暂无

模块指令

JSON.TYPE

版本:1.0.0+ 复杂度:O(N)当path值为单个值时N为keys对应的对象数量,当path值为多个值时则N表键的大小。

语法:

JSON.TYPE <key> [path]

说明: 返回 [path] 对应的 JSON 值类型。 [path] 未提供则默认为根目录,无匹配结果则返回null。

返回值: 字符串数组,对应每一个路径的JSON值类型。

例子:

127.0.0.1:6379> JSON.SET doc $ '{"a":2, "nested": {"a": true}, "foo": "bar"}'
OK
127.0.0.1:6379> JSON.TYPE doc $..foo
1) "string"
127.0.0.1:6379> JSON.TYPE doc $..a
1) "integer"
2) "boolean"
127.0.0.1:6379> JSON.TYPE doc $..dummy
(empty array)

JSON.DEBUG

版本:1.0.0+ 复杂度:O(N)其中N为JSON值大小。

语法:

JSON.DEBUG <subcommand & arguments>

说明: 报告信息。 支持的子命令如下:

  • MEMORY <key> [path] - 以字节的方式报告内存使用情况,[path]未提供时默认为根目录
  • HELP - 报告帮助信息

返回值: 取决于所使用的子命令。

  • MEMORY - 整数,内存使用的大小
  • HELP - 数组,帮助列表

例子:

JSON.FORGET

JSON.DEL 指令相同

JSON.RESP

版本:1.0.0+ 复杂度:O(N)当path值为单个值时N为值的大小,当path值为多个值时则N表键的大小。

语法:

JSON.RESP <key> [path]

说明: 返回<key>对应符合 Redis Serialization Protocol (RESP) 协议的 JSON [path] 未提供则默认为根目录。

返回值: 数组, 详细的 JSON 的 RESP 表格。

例子: