정의
$convert 표현식은 바이너리 데이터 유형을 변환합니다. Kafka 헤더의 바이너리 데이터를 변환하는 데 사용할 수 있습니다.
$convert$convert표현식의 프로토타입 형식은 다음과 같습니다.{ input: "$binDataField", to: <int, long, double>, byteOrder: "little"|"big" } { input: "$intLongOrDoubleField", to: "binData", byteOrder: "little"|"big" } { input: "$binDataField", to: "string", format: <base64, base64url, hex, uuid, utf8> } { input: "$stringField", to: "binData", format: <base64, base64url, hex, uuid, utf8> }
구문
$convert 집계 연산자는 Atlas Stream Processing 버전의 $convert 표현식에서 제공하는 바이너리 데이터 유형을 제외한 데이터 유형 간을 변환합니다.
$convert 표현식은 다음 필드가 있는 문서를 사용합니다.
필드 | 값 | 필요성 | 설명 |
|---|---|---|---|
|
| 필수 사항 | 바이너리 데이터로 변환될 |
|
| 필수 사항 |
|
| 작은, 큰 | 옵션 |
|
| base64, base64url, hex, uuid, utf8 | 필수 사항 |
|
행동
$convert.to 값이 int인 경우 binData input 값은 1, 2 또는 4여야 합니다. $convert.to 값이 long인 경우 binData input 값은 1, 2, 4 또는 8여야 합니다. input이 예상치 못한 길이인 경우 오류가 발생합니다. $convert.onError를 구성하여 이 동작을 제어할 수 있습니다.
binData로 변환할 때 int는 4바이트 binData가 되고, long는 8바이트 binData가 되며, double는 8바이트 binData가 됩니다. binData에서 double로 변환할 때 8바이트 입력은 IEEE 754 배정밀도 부동 소수점으로 해석되고 4바이트 입력은 IEEE 754 단정밀도 부동 소수점으로 해석됩니다. MQL은 이중 정밀도 부동 소수점만 지원하므로 단일 정밀도 부동 소수점 값에서 이중 정밀도로 손실 없는 변환을 수행합니다.
binData를 숫자 유형으로 변환:
$convert.to | int | long | double |
|---|---|---|---|
허용 너비(바이트) | 1, 2, 4 | 1, 2, 4, 8 | 4, 8 |
| 2의 보수 부호 정수 | 2의 보수 부호 정수 | IEEE 754 단정밀도 또는 배정밀도 부동 소수점 |
숫자 유형을 binData 형식으로 변환:
입력 | int | long | double |
|---|---|---|---|
출력 폭(바이트) | 4 | 8 | 8 |
예시
다음 예시에서는 다음과 같은 바이너리 표기법을 사용하여 binData를 설명합니다.
BinData(0b00000000 00000010)
가장 왼쪽 바이트(00000000)는 가장 낮은 메모리 주소 또는 바이트 배열의 0번째 인덱스에 해당합니다. 마찬가지로 다음과 같은 헥스 표기법을 사용합니다.
BinData(0x0100 000A)
가장 왼쪽 바이트(01)는 가장 낮은 메모리 주소 또는 바이트 배열의 0번째 인덱스에 해당합니다.
다음 문서는 BinData, int, long 및 double 표기법에서 값을 변환하는 $convert 표현식의 예시입니다.
{ $convert: { input: BinData(0b00000000 00000010), to: “int”, byteOrder: “big” } }
결과: 2
{ $convert: { input: BinData(0b00000001 00000000), to: “int”, byteOrder: “big” } }
결과: 256
{ $convert: { input: BinData(0b00000001 00000000), to: “int”, byteOrder: “little” } }
결과: 1
{ $convert: { input: BinData(0x0001 0000), to: “int”, byteOrder: “big” } }
결과: 65536
{ $convert: { input: BinData(0x0001 0000 0000 0000), to: “long”, byteOrder: “big” } }
결과: 281474976710656
{ $convert: { input: BinData(0xFFFE7960), to: “int”, byteOrder: “big” } }
결과: -100000
{ $convert: { input: BinData(0x0001 0000 0000 0000), to: “int”, byteOrder: “big” } }
결과: 오류 - binData 길이는 == "int"인 경우 1,2 또는 4 바이트만 가능합니다.
{ $convert: { input: BinData(0xC04C CCCD), to: “double”, byteOrder: “big” } }
결과: -3.2000000476837158203125
{ $convert: { input: BinData(0x0000), to: “double”, byteOrder: “big” } }
결과: 오류 - binData 길이는 == "double"일 때 4 또는 8바이트만 가능합니다.
{ $convert: { input: true, to: “binData” } }
결과: BinData(0x01) // subtype 0
{ $convert: { input: false, to: “binData” } }
결과: BinData(0x00) // subtype 0
{ $convert: { input: NumberLong(42), to: “binData”, byteOrder: “big” } }
결과: BinData(0x0000 0000 0000 002A) // subtype 0
{ $convert: { input: NumberLong(42), to: “binData”, byteOrder: “little” } }
결과: BinData(0x2A00 0000 0000 0000) // subtype 0
{ $convert: { input: { $toInt: “$myNumericField” }, to: “binData”, byteOrder: “little” } }
myNumericField가 Int(42), Long(42) 또는 Double(42.0).
결과: BinData(0x2A00 0000)
{ $convert: { input: “$myIntOrLongField”, to: “binData”, byteOrder: “little” } }
입력값이 Int(42)인 경우:
결과: BinData(0x2A00 0000)
입력이 Long(42)인 경우:
BinData(0x2A00 0000 0000 0000)