JSON.SET
语法
JSON.SET key path value [NX | XX]
- 可用版本
- Redis 开源版 / JSON 1.0.0
- 时间复杂度
- 当 path 评估为单个值时,复杂度为 O(M+N),其中 M 是原始值(如果存在)的大小,N 是新值的大小;当 path 评估为多个值时,复杂度为 O(M+N),其中 M 是 key 的大小,N 是新值的大小 * key 中原始值的数量
- ACL 类别
-
@json,@write,@slow,
设置 key 中 path 处的 JSON 值
必需参数
key
要修改的 key。
path
指定 JSONPath。默认是根节点 $。对于新的 Redis key,path 必须是根节点。对于现有的 key,当整个 path 存在时,其包含的值会被 json 值替换。对于现有的 key,当 path 存在,但最后一个元素除外时,将添加一个新子节点,其值为 json 值。
仅当它是 path 中的最后一个子节点,或者它是 path 中正在添加的新子节点的父节点时,才将 key(及其对应值)添加到 JSON 对象(在 RedisJSON 数据类型 key 中)。可选参数 NX 和 XX 会修改此行为,对新的 RedisJSON 数据类型 key 和其中的 JSON 对象 key 都生效。
value
要在指定 path 处设置的值
可选参数
NX
仅当 key 不存在时才设置。
XX
仅当 key 已经存在时才设置。
返回值
返回以下回复之一
- 简单字符串回复:如果执行成功则返回
OK nil- 如果
key存在但path不存在且无法创建 - 如果
NX或XX条件未满足
- 如果
- 如果
key不存在且path不是根节点 (.或$) 则报错
有关回复的更多信息,请参阅 Redis 序列化协议规范。
示例
替换现有值
redis> JSON.SET doc $ '{"a":2}'
OK
redis> JSON.SET doc $.a '3'
OK
redis> JSON.GET doc $
"[{\"a\":3}]"添加新值
redis> JSON.SET doc $ '{"a":2}'
OK
redis> JSON.SET doc $.b '8'
OK
redis> JSON.GET doc $
"[{\"a\":2,\"b\":8}]"更新多个 path
redis> JSON.SET doc $ '{"f1": {"a":1}, "f2":{"a":2}}'
OK
redis> JSON.SET doc $..a 3
OK
redis> JSON.GET doc
"{\"f1\":{\"a\":3},\"f2\":{\"a\":3}}"path 不存在且无法创建
redis> JSON.SET doc $ 1
OK
redis> JSON.SET doc $.x.y 2
(nil)XX 条件未满足
redis> JSON.SET nonexistentkey $ 5 XX
(nil)
redis> JSON.GET nonexistentkey
(nil)key 不存在且 path 不是根节点
redis> JSON.SET nonexistentkey $.x 5
(error) ERR new objects must be created at the root