정의
$substrBytes
문자열의 부분 문자열을 반환합니다. 하위 문자열은 문자열에서 지정된 UTF-8 바이트 인덱스(0부터 시작)에 있는 문자로 시작하여 지정된 바이트 수만큼 계속됩니다.
$substrBytes
에는 다음과 같은 연산자 표현식 구문이 있습니다.{ $substrBytes: [ <string expression>, <byte index>, <byte count> ] } 필드유형설명string expression
문자열
부분 문자열이 추출될 문자열입니다.
string expression
는 문자열로 해석되는 한 모든 유효한 표현식 일 수 있습니다. 표현식에 대한 자세한 내용은 표현식 연산자를 참조하세요.인수가 값으로
null
해석되거나 누락된 필드$substrBytes
참조하는 경우 는 빈 문자열을 반환합니다.인수가 문자열 또는 로 해석되지 않거나
null
누락된 필드 를$substrBytes
참조하는 경우 은 오류를 반환합니다.byte index
숫자
부분 문자열의 시작점을 나타냅니다.
byte index
은(는) 음수가 아닌 정수 또는 정수(예: 2.0)로 표현할 수 있는 숫자로 해석되는 한 모든 유효한 표현식 이 될 수 있습니다.byte index
멀티바이트 UTF-8 문자 중간에 있는 시작 인덱스를 참조할 수 없습니다.byte count
숫자
음수가 아닌 정수 또는 정수(예: 2.0)로 표현할 수 있는 숫자로 해석되는 한 모든 유효한 표현식 이 될 수 있습니다.
byte count
는 UTF-8 문자 중간에 있는 끝 인덱스를 생성할 수 없습니다.
행동
$substrBytes
연산자는 각 코드 포인트 또는 문자가 인코딩하는 데 1~4바이트를 사용할 수 있는 UTF-8 인코딩 바이트의 인덱스를 사용합니다.
예를 예시, US-ASCII 문자는 1바이트를 사용하여 인코딩됩니다. 분음 부호와 추가 라틴 알파벳 문자(영어 알파벳 이외의 라틴 문자)가 있는 문자는 2바이트를 사용하여 인코딩됩니다. 중국어, 일본어 및 한국어 문자에는 일반적으로 3바이트가 필요하고, 다른 유니코드 평면(이모티콘, 수학 기호 등)에는 4바이트가 필요합니다.
UTF-8 문자 중간에 byte index
또는 byte count
를 제공하면 오류가 발생하므로 string expression
의 내용에 유의하는 것이 중요합니다.
$substrBytes
는 각 문자의 바이트 수를 계산하는 반면 $substrCP
는 문자가 사용하는 바이트 수에 상관없이 코드 포인트 또는 문자 수를 계산한다는 점에서 $substrBytes
는 $substrCP
와 다릅니다.
예시 | 결과 | ||
---|---|---|---|
|
| ||
|
| ||
|
| ||
|
| ||
| 메시지 오류:
| ||
| 메시지 오류:
|
예시
싱글 바이트 문자 세트
다음 문서가 포함된 inventory
컬렉션을 생각해 보세요.
db.inventory.insertMany( [ { _id: 1, item: "ABC1", quarter: "13Q1", description: "product 1" }, { _id: 2, item: "ABC2", quarter: "13Q4", description: "product 2" }, { _id: 3, item: "XYZ1", quarter: "14Q2", description: null } ] )
다음 연산은 $substrBytes
연산자를 사용하여 quarter
값(단일 바이트 US-ASCII 문자만 포함)을 yearSubstring
과 quarterSubstring
으로 분리합니다. quarterSubstring
필드는 yearSubstring
에 이어서 지정된 byte index
의 나머지 string을 나타냅니다. 이는 $strLenBytes
를 사용하여 string의 길이에서 byte index
를 뺀 값으로 계산됩니다.
db.inventory.aggregate( [ { $project: { item: 1, yearSubstring: { $substrBytes: [ "$quarter", 0, 2 ] }, quarterSubtring: { $substrBytes: [ "$quarter", 2, { $subtract: [ { $strLenBytes: "$quarter" }, 2 ] } ] } } } ] )
이 연산은 다음과 같은 결과를 반환합니다.
{ _id: 1, item: "ABC1", yearSubstring: "13", quarterSubtring: "Q1" } { _id: 2, item: "ABC2", yearSubstring: "13", quarterSubtring: "Q4" } { _id: 3, item: "XYZ1", yearSubstring: "14", quarterSubtring: "Q2" }
싱글바이트 및 멀티바이트 문자 세트
다음 문서로 food
컬렉션을 생성합니다.
db.food.insertMany( [ { _id: 1, name: "apple" }, { _id: 2, name: "banana" }, { _id: 3, name: "éclair" }, { _id: 4, name: "hamburger" }, { _id: 5, name: "jalapeño" }, { _id: 6, name: "pizza" }, { _id: 7, name: "tacos" }, { _id: 8, name: "寿司sushi" } ] )
다음 작업은 $substrBytes
연산자를 사용하여 name
값에서 3바이트 menuCode
를 생성합니다.
db.food.aggregate( [ { $project: { "name": 1, "menuCode": { $substrBytes: [ "$name", 0, 3 ] } } } ] )
이 연산은 다음과 같은 결과를 반환합니다.
{ _id: 1, name: "apple", menuCode: "app" } { _id: 2, name: "banana", menuCode: "ban" } { _id: 3, name: "éclair", menuCode: "éc" } { _id: 4, name: "hamburger", menuCode: "ham" } { _id: 5, name: "jalapeño", menuCode: "jal" } { _id: 6, name: "pizza", menuCode: "piz" } { _id: 7, name: "tacos", menuCode: "tac" } { _id: 8, name: "寿司sushi", menuCode: "寿" }