기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
JSON 데이터 형식 개요
MemoryDB는 JSON 데이터 유형 작업을 위한 여러 Valkey 및 Redis OSS 명령을 지원합니다. 다음은 JSON 데이터 형식의 개요와 지원되는 명령의 세부 목록입니다.
용어
용어 | 설명 |
---|---|
JSON 문서 |
JSON 키의 값을 나타냅니다. |
JSON 값 |
는 전체 JSON 문서를 나타내는 루트를 포함하여 문서의 하위 집합을 나타냅니다. 값은 컨테이너 또는 컨테이너 내의 항목일 수 있습니다. |
JSON 요소 |
JSON 값과 동등 |
지원되는 JSON 표준
JSON 형식은 RFC 7159
루트 요소
루트 요소는 모든 JSON 데이터 유형일 수 있습니다. 이전 RFC 4627에서는 객체 또는 배열만 루트 값으로 허용되었습니다. RFC 7159로 업데이트한 이후 JSON 문서의 루트는 모든 JSON 데이터 형식일 수 있습니다.
문서 크기 제한
JSON 문서는 빠른 액세스 및 수정에 최적화된 형식으로 내부적으로 저장됩니다. 이 형식은 일반적으로 동일한 문서의 동등하게 직렬화된 표현보다 어느 정도 더 많은 메모리를 소비하게 됩니다. 단일 JSON 문서의 메모리 사용량은 JSON 문자열이 아닌 인 메모리 데이터 구조의 크기인 64MB 로 제한됩니다. JSON 문서에서 사용하는 메모리의 양은 JSON.DEBUG MEMORY
명령을 사용하여 검사할 수 있습니다.
JSON ACLs
JSON datatype은 Valkey 및 Redis OSS Access Control Lists(ACL)
기능에 완전히 통합됩니다. 기존 데이터 유형별 범주(@string, @hash 등)와 마찬가지로 새 범주 @json이 추가되어 JSON 명령 및 데이터에 대한 액세스 관리를 간소화합니다. 다른 기존 Valkey 또는 Redis OSS 명령은 @json 범주의 구성원이 아닙니다. 모든 JSON 명령은 모든 키스페이스 또는 명령 제한 및 권한을 적용합니다. 새 JSON 명령을 포함하도록 업데이트된 기존 ACL 범주는 @read, @write, @fast, @slow 및 @admin의 다섯 가지입니다. 아래 표는 적절한 범주에 대한 JSON 명령 매핑을 나타냅니다.
JSON 명령 | @read | @write | @fast | @slow | @admin |
---|---|---|---|---|---|
JSON.ARRAPPEND |
y |
y |
|||
JSON.ARRINDEX |
y |
y |
|||
JSON.ARRINSERT |
y |
y |
|||
JSON.ARRLEN |
y |
y |
|||
JSON.ARRPOP |
y |
y |
|||
JSON.ARRTRIM |
y |
y |
|||
JSON.CLEAR |
y |
y |
|||
JSON.DEBUG |
y |
y |
y |
||
JSON.DEL |
y |
y |
|||
JSON.FORGET |
y |
y |
|||
JSON.GET |
y |
y |
|||
JSON.MGET |
y |
y |
|||
JSON.NUMINCRBY |
y |
y |
|||
JSON.NUMMULTBY |
y |
y |
|||
JSON.OBJKEYS |
y |
y |
|||
JSON.OBJLEN |
y |
y |
|||
JSON.RESP |
y |
y |
|||
JSON.SET |
y |
y |
|||
JSON.STRAPPEND |
y |
y |
|||
JSON.STRLEN |
y |
y |
|||
JSON.STRLEN |
y |
y |
|||
JSON.TOGGLE |
y |
y |
|||
JSON.TYPE |
y |
y |
|||
JSON.NUMINCRBY |
y |
y |
중첩 깊이 제한
JSON 객체 또는 배열에 자체적으로 다른 JSON 객체 또는 배열인 요소가 있는 경우 해당 내부 객체 또는 배열은 외부 객체 또는 배열 내에 “중첩”된다고 합니다. 최대 중첩 깊이 제한은 128입니다. 중첩 깊이가 128보다 큰 문서를 만들려는 시도는 오류와 함께 거부됩니다.
명령 구문
대부분의 명령에는 첫 번째 인수로 Valkey 또는 Redis OSS 키 이름이 필요합니다. 일부 명령에는 path 인수도 있습니다. path 인수가 선택 사항이며 제공되지 않는 경우, 기본 루트로 설정됩니다.
표기법:
필수 인수는 각괄호로 묶습니다. 예: <키>
선택적 인수는 대괄호로 묶습니다. 예: [path]
추가 선택적 인수는 ... 로 표시됩니다 예: [json...]
경로 구문
JSON for Valkey 및 Redis는 두 가지 종류의 경로 구문을 OSS 지원합니다.
향상된 구문 - 아래 표와 같이 Goessner
에서 설명하는 JSONPath 구문을 따릅니다. 명확하게 하기 위해 표의 설명을 재정렬하고 수정했습니다. 제한된 구문(Restricted syntax) - 쿼리 기능이 제한되었습니다.
참고
일부 명령의 결과는 사용되는 경로 구문 유형에 민감합니다.
쿼리 경로가 '$'로 시작하는 경우 향상된 구문을 사용합니다. 그렇지 않으면 제한된 구문이 사용됩니다.
향상된 구문
기호/표현식 | 설명 |
---|---|
$ |
루트 요소 |
. 또는 [] |
하위 연산자 |
.. |
재귀 하강 |
* |
와일드카드 객체 또는 배열의 모든 요소. |
[] |
배열 아래 첨자 연산자 인덱스는 0부터 시작합니다. |
[,] |
조합 연산자 |
[start:end:step] |
배열 조각 연산자 |
?() |
현재 배열 또는 객체에 필터(스크립트) 표현식을 적용합니다. |
() |
필터 표현식 |
@ |
처리 중인 현재 노드를 참조하는 필터 표현식에 사용됩니다. |
== |
같음, 필터 표현식에 사용됩니다. |
!= |
같지 않음, 필터 표현식에 사용됩니다. |
> |
더 큼, 필터 표현식에 사용됩니다. |
>= |
더 크거나 같음, 필터 표현식에 사용됩니다. |
< |
더 작음, 필터 표현식에 사용됩니다. |
<= |
더 작거나 같음, 필터 표현식에 사용됩니다. |
&& |
논리적 AND, 여러 필터 표현식을 결합하는 데 사용됩니다. |
|| |
논리적 OR, 여러 필터 표현식을 결합하는 데 사용됩니다. |
예
아래 예제는 Goessner의
{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95, "in-stock": true, "sold": true }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99, "in-stock": false, "sold": true }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99, "in-stock": true, "sold": false }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99, "in-stock": false, "sold": false } ], "bicycle": { "color": "red", "price": 19.95, "in-stock": true, "sold": false } } }
경로 | 설명 |
---|---|
$.store.book[*].author |
상점에 있는 모든 책의 저자. |
$..author |
모든 저자. |
$.store.* |
상점의 모든 구성원. |
$["store"].* |
상점의 모든 구성원. |
$.store..price |
상점에 있는 모든 것의 가격. |
$..* |
JSON 구조의 모든 재귀 멤버 |
$..book[*] |
모든 책. |
$..book[0] |
첫 번째 책. |
$..book[-1] |
마지막 책. |
$..book[0:2] |
처음 두 권의 책. |
$..book[0,1] |
처음 두 권의 책. |
$..book[0:4] |
인덱스 0에서 3까지의 책(끝 인덱스는 포괄적이지 않음). |
$..book[0:4:2] |
인덱스 0, 2의 책. |
$..book[?(@.isbn)] |
ISBN 번호가 있는 모든 책. |
$..book[?(@.price<10)] |
모든 책이 10달러보다 저렴합니다. |
'$..book[?(@.price < 10)]' |
모든 책이 10달러보다 저렴합니다. (경로에 공백이 포함된 경우, 따옴표로 묶어야 합니다.) |
'$..book[?(@["price"] < 10)]' |
모든 책이 10달러보다 저렴합니다. |
'$..book[?(@.["price"] < 10)]' |
모든 책이 10달러보다 저렴합니다. |
$..book[?(@.price>=10&&@.price<=100)] |
가격대가 10달러에서 100달러인 모든 책, 포괄적. |
'$..book[?(@.price>=10 && @.price<=100)]' |
가격대가 10달러에서 100달러인 모든 책, 포괄적. (경로에 공백이 포함된 경우, 따옴표로 묶어야 합니다.) |
$..book[?(@.sold==true||@.in-stock==false)] |
모든 책이 매각 또는 품절되었습니다. |
'$..book[?(@.sold == true || @.in-stock == false)]' |
모든 책이 매각 또는 품절되었습니다. (경로에 공백이 포함된 경우, 따옴표로 묶어야 합니다.) |
'$.store.book[?(@.["category"] == "fiction")]' |
소설 범주의 모든 책. |
'$.store.book[?(@.["category"] != "fiction")]' |
비소설 범주의 모든 책. |
추가 필터 표현식의 예:
127.0.0.1:6379> JSON.SET k1 . '{"books": [{"price":5,"sold":true,"in-stock":true,"title":"foo"}, {"price":15,"sold":false,"title":"abc"}]}' OK 127.0.0.1:6379> JSON.GET k1 $.books[?(@.price>1&&@.price<20&&@.in-stock)] "[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?(@.price>1 && @.price<20 && @.in-stock)]' "[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?((@.price>1 && @.price<20) && (@.sold==false))]' "[{\"price\":15,\"sold\":false,\"title\":\"abc\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?(@.title == "abc")]' [{"price":15,"sold":false,"title":"abc"}] 127.0.0.1:6379> JSON.SET k2 . '[1,2,3,4,5]' 127.0.0.1:6379> JSON.GET k2 $.*.[?(@>2)] "[3,4,5]" 127.0.0.1:6379> JSON.GET k2 '$.*.[?(@ > 2)]' "[3,4,5]" 127.0.0.1:6379> JSON.SET k3 . '[true,false,true,false,null,1,2,3,4]' OK 127.0.0.1:6379> JSON.GET k3 $.*.[?(@==true)] "[true,true]" 127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ == true)]' "[true,true]" 127.0.0.1:6379> JSON.GET k3 $.*.[?(@>1)] "[2,3,4]" 127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ > 1)]' "[2,3,4]"
제한된 구문(Restricted syntax)
기호/표현식 | 설명 |
---|---|
. 또는 [] |
하위 연산자. |
[] |
배열 아래 첨자 연산자. 인덱스는 0부터 시작합니다. |
예제
경로 | 설명 |
---|---|
.store.book[0].author |
첫 번째 책의 저자. |
.store.book[-1].author |
마지막 책의 저자. |
.address.city |
도시 이름. |
["store"]["book"][0]["title"] |
첫 번째 책의 제목. |
["store"]["book"][-1]["title"] |
마지막 책의 제목. |
참고
이 문서에 인용된 모든 Goessner
일반적인 오류 접두사
각 오류 메시지에는 접두사가 있습니다. 다음은 일반적인 오류 접두사 목록입니다.
접두사 | 설명 |
---|---|
ERR |
일반 오류. |
LIMIT |
크기 제한 초과 오류. 예: 문서 크기 제한 또는 중첩 깊이 제한을 초과했습니다. |
NONEXISTENT |
키 또는 경로가 존재하지 않습니다. |
OUTOFBOUNDARIES |
배열 인덱스가 범위를 벗어났습니다. |
SYNTAXERR |
구문 오류 |
WRONGTYPE |
잘못된 값 유형. |
JSON 관련 지표
다음 JSON 정보 지표가 제공됩니다.
정보 | 설명 |
---|---|
json_total_memory_bytes |
JSON 객체에 할당된 총 메모리 |
json_num_documents |
Valkey 또는 Redis OSS 엔진의 총 문서 수 |
핵심 지표를 쿼리하려면 다음 명령을 실행합니다.
info json_core_metrics
MemoryDB와 상호 작용하는 방법 JSON
다음은 MemoryDB가 JSON 데이터 유형과 상호 작용하는 방식을 보여줍니다.
연산자 우선순위
필터링에 대한 조건식을 평가하는 경우 &&s가 먼저 평가되고 그 다음 ||s가 평가되는데, 이는 대부분의 언어에서 일반적으로 사용됩니다. 괄호 안의 작업이 먼저 실행됩니다.
최대 경로 중첩 제한 동작
MemoryDB의 최대 경로 중첩 제한은 128입니다. 따라서 $.a.b.c.d...
와 같은 값은 128수준까지만 도달할 수 있습니다.
숫자 값 처리
JSON 에는 정수 및 부동 소수점 번호에 대한 별도의 데이터 유형이 없습니다. 모두 숫자라고 부릅니다.
JSON 번호가 수신되면 두 가지 형식 중 하나로 저장됩니다. 숫자가 64비트 부호 있는 정수에 맞으면 해당 형식으로 변환되고 그렇지 않으면 문자열로 저장됩니다. 두 개의 JSON 숫자(예: JSON.NUMINCRBY 및 .JSONNUMMULTBY)에 대한 산술 작업은 가능한 한 정밀도를 유지하려고 시도합니다. 두 피연산자와 결과 값이 부호 있는 64비트 정수에 맞으면 정수 산술이 수행됩니다. 그렇지 않으면 입력 피연산자가 64비트 IEEE 이중 정밀도 부동 소수점 번호로 변환되고 산술 연산이 수행되며 결과가 문자열로 다시 변환됩니다.
산술 명령어 NUMINCRBY
과 NUMMULTBY
:
두 숫자가 모두 정수이고 결과가 int64 범위를 벗어나는 경우, 자동으로 배정밀도 부동 소수점 숫자가 됩니다.
숫자 중 하나 이상이 부동 소수점인 경우, 결과는 배정밀도 부동 소수점 숫자가 됩니다.
결과가 두 배의 범위를 초과하면 명령은
OVERFLOW
오류를 반환합니다.
참고
입력 시 JSON 숫자가 수신되는 Redis OSS 엔진 버전 6.2.6.R2 이전에는 64비트 부호 있는 정수 또는 64비트 IEEE 이중 정밀도 부동 소수점이라는 두 가지 내부 바이너리 표현 중 하나로 변환됩니다. 원래 문자열 및 모든해당 서식은 보관되지 않습니다. 따라서 숫자가 JSON 응답의 일부로 출력되면 내부 바이너리 표현에서 일반 형식 지정 규칙을 사용하는 인쇄 가능한 문자열로 변환됩니다. 이러한 규칙은 수신된 문자열과 다른 문자열이 생성될 수 있습니다.
두 숫자가 정수이고 결과가 범위를 벗어나는 경우
int64
자동으로 64비트 IEEE 이중 정밀도 부동 소수점 번호가 됩니다.숫자 중 하나 이상이 부동 소수점인 경우 결과는 64비트 IEEE 이중 정밀도 부동 소수점 번호입니다.
결과가 64비트 IEEE 이중 범위를 초과하는 경우 명령은
OVERFLOW
오류를 반환합니다.
사용할 수 있는 명령의 자세한 목록은 지원되는 명령 섹션을 참조하세요.
엄격한 구문 평가
MemoryDB는 경로의 하위 집합에 유효한 JSON 경로가 포함되어 있더라도 잘못된 구문이 있는 경로를 허용하지 않습니다. 이는 고객에게 올바른 행동을 유지하는 것과 같습니다.