JSON.MERGE
语法
JSON.MERGE key path value
- 可用版本
- Redis Open Source / JSON 2.6.0
- 时间复杂度
- 当 path 评估为单个值时为 O(M+N),其中 M 是原始值的大小(如果存在),N 是新值的大小;当 path 评估为多个值时为 O(M+N),其中 M 是键的大小,N 是新值的大小 * 键中原始值的数量
- ACL 类别
-
@json,@write,@slow,
将给定的 JSON 值合并到匹配的路径中。因此,匹配路径上的 JSON 值将被更新、删除或通过新子项进行扩展。
此命令遵循 RFC7396 Json Merge Patch 规范
必需参数
key
是要合并到的键。
path
指定 JSONPath。对于不存在的键,path 必须是 $。对于已存在的键,对于每个匹配的 path,与 path 匹配的值将与 JSON value 合并。对于已存在的键,当 path 存在时,除了最后一个元素外,将使用 JSON value 添加一个新子项。
value
是要在指定的 path 下合并的 JSON 值。合并按照 value 参数中每个 JSON 值的以下规则进行,同时考虑相应的原始值(如果存在)
- 将现有的对象键与
null值合并将删除该键 - 将现有的对象键与非 null 值合并将更新该值
- 将不存在的对象键合并将添加该键和值
- 将现有数组与任何合并值合并,将用该值替换整个数组
返回值
JSON.MERGE 返回一个简单的字符串回复:如果执行成功则返回 OK,如果无法设置新值则返回 error
有关回复的更多信息,请参阅 Redis 序列化协议规范。
示例
JSON.MERGE 提供四种不同的行为来合并给定键上的更改:创建不存在的 path、使用新值更新现有 path、删除现有 path 或用新数组替换数组
创建不存在的 path-value
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]}]"合并多 path 中的更改
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