JSON.MERGE
语法
JSON.MERGE key path value
- 可用版本
- Redis Stack / JSON 2.6.0
- 时间复杂度
- 当路径解析为单个值时为 O(M+N),其中 M 是原始值的大小(如果存在),N 是新值的大小;当路径解析为多个值时为 O(M+N),其中 M 是键的大小,N 是新值的大小 * 键中原始值的数量。
将给定的 JSON 值合并到匹配的路径中。因此,匹配路径上的 JSON 值会更新、删除或扩展为新的子节点。
此命令符合 RFC7396 Json Merge Patch。
必需参数
key
是要合并的键。
path
指定 JSONPath。对于不存在的键,path
必须是 $
。对于存在的键,对于每个匹配的 path
,匹配 path
的值将与 JSON value
合并。对于存在的键,当路径存在时,除了最后一个元素之外,会使用 JSON value
添加新的子节点。
value
是要在指定路径上合并的 JSON 值。合并是根据 value
参数中的每个 JSON 值执行的,同时考虑如果存在相应的原始值。
- 将现有对象键与
null
值合并会删除该键 - 将现有对象键与非 null 值合并会更新该值
- 合并不存在的对象键会添加键和值
- 将现有数组与任何合并的值合并会将整个数组替换为该值
返回值
JSON.MERGE 返回一个简单的字符串回复:如果执行成功则为 OK
,如果无法设置新值则为 error
。
有关回复的更多信息,请参见 Redis 序列化协议规范。
示例
JSON.MERGE 提供四种不同的行为来合并对给定键的更改:创建不存在的路径、使用新值更新现有路径、删除现有路径或用新数组替换数组。
创建不存在的路径-值
redis> JSON.SET doc $ '{"a":2}'
OK
redis> JSON.MERGE doc $.b '8'
OK
redis> JSON.GET doc $
"[{\"a\":2,\"b\":8}]"
替换现有值
redis> JSON.SET doc $ '{"a":2}'
OK
redis> JSON.MERGE doc $.a '3'
OK
redis> JSON.GET doc $
"[{\"a\":3}]"
删除现有值
redis> JSON.SET doc $ '{"a":2}'
OK
redis> JSON.MERGE doc $ '{"a":null}'
OK
redis> JSON.GET doc $
"[{}]"
替换数组
redis> JSON.SET doc $ '{"a":[2,4,6,8]}'
OK
redis> JSON.MERGE doc $.a '[10,12]'
OK
redis> JSON.GET doc $
"[{\"a\":[10,12]}]"
合并多路径中的更改
redis> JSON.SET doc $ '{"f1": {"a":1}, "f2":{"a":2}}'
OK
redis> JSON.GET doc
"{\"f1\":{\"a\":1},\"f2\":{\"a\":2}}"
redis> JSON.MERGE doc $ '{"f1": null, "f2":{"a":3, "b":4}, "f3":[2,4,6]}'
OK
redis> JSON.GET doc
"{\"f2\":{\"a\":3,\"b\":4},\"f3\":[2,4,6]}"
另请参阅
JSON.GET
| JSON.MGET
| JSON.SET
| JSON.MSET