JSON.MERGE
Syntax
JSON.MERGE key path value
- Available in:
- Redis Stack / JSON 2.6.0
- Time complexity:
- O(M+N) when path is evaluated to a single value where M is the size of the original value (if it exists) and N is the size of the new value, O(M+N) when path is evaluated to multiple values where M is the size of the key and N is the size of the new value * the number of original values in the key
将给定的JSON值合并到匹配的路径中。因此,匹配路径上的JSON值将被更新、删除或扩展为新的子项。
此命令符合RFC7396 Json Merge Patch
必需的参数
key
是要合并的关键。
path
指定JSONPath。对于不存在的键,path
必须为$
。对于存在的键,对于每个匹配的path
,与path
匹配的值将与JSON value
合并。对于存在的键,当路径存在时,除了最后一个元素外,将添加一个新的子元素,并使用JSON value
。
value
是要在指定路径合并的JSON值。合并是根据value
参数中的每个JSON值按照以下规则进行的,同时考虑相应的原始值(如果存在):
- 将现有对象键与
null
值合并会删除该键 - 合并现有对象键与非空值会更新该值
- 合并一个不存在的对象键会添加键和值
- 将现有数组与任何合并值合并,用该值替换整个数组
返回值
JSON.MERGE 返回一个简单的字符串回复:如果执行正确则返回 OK
,如果设置新值失败则返回 error
有关回复的更多信息,请参阅Redis序列化协议规范。
示例
JSON.MERGE 提供了四种不同的行为来合并给定键上的更改:创建不存在的路径,用新值更新现有路径,删除现有路径,或用新数组替换数组
Create a non-existent path-value
redis> JSON.SET doc $ '{"a":2}'
OK
redis> JSON.MERGE doc $.b '8'
OK
redis> JSON.GET doc $
"[{\"a\":2,\"b\":8}]"
Replace an existing value
redis> JSON.SET doc $ '{"a":2}'
OK
redis> JSON.MERGE doc $.a '3'
OK
redis> JSON.GET doc $
"[{\"a\":3}]"
Delete an existing value
redis> JSON.SET doc $ '{"a":2}'
OK
redis> JSON.MERGE doc $ '{"a":null}'
OK
redis> JSON.GET doc $
"[{}]"
Replace an Array
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]}]"
Merge changes in multi-paths
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