$convert
定义
$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
表达式接受包含以下字段的文档:
字段 | 值 | 必要性 | 说明 |
---|---|---|---|
input | binData 、 int 、 long 、 double 和string | 必需 | 要转换为 int 、 long 、 double 或string 类型的二进制数据,或要转换的int 、 long 、 double 或string 类型数据为二进制数据。 |
to | binData 、 int 、 long 、 double 和string | 必需 | 指定 input 转换后的数据类型。您可以指定为int 、 long 、 double 、 string 或binData 。 |
byteOrder | 小,大 | 必需 | 指定 注意
|
format | 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 |
binData 被解释为 | 有符号整数的二进制补码 | 有符号整数的二进制补码 | IEEE 754单精度或双精度点 |
将数字类型转换为binData
:
输入 | int | long | double |
---|---|---|---|
输出宽度(以字节为单位) | 4 | 8 | 8 |
示例
在以下示例中,我们使用二进制表示法来描述binData
,例如:
BinData(0b00000000 00000010)
最左边的字节 ( 00000000 ) 对应于最低内存解决,或字节大量的第0个索引。同样,我们使用十六进制表示法,例如:
BinData(0x0100 000A)
最左边的字节 ( 01 ) 对应于最低内存解决,或字节大量的第0个索引。
以下文档是示例$convert
表达式,它们跨BinData
、 int
、 long
和double
表示法转换值:
{ $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” } }
结果:错误 — 当 to == “int” 时,binData 长度只能是1 、 2或4字节。
{ $convert: { input: BinData(0xC04C CCCD), to: “double”, byteOrder: “big” } }
结果:- 3.2000000476837158203125
{ $convert: { input: BinData(0x0000), to: “double”, byteOrder: “big” } }
结果:错误 — 当 to == “double” 时,binData 长度只能是4或8字节。
{ $convert: { input: true, to: “binData” } }
Result: BinData( 0 x 01 ) // 子类型0
{ $convert: { input: false, to: “binData” } }
Result: BinData( 0 x 00 ) // 子类型0
{ $convert: { input: NumberLong(42), to: “binData”, byteOrder: “big” } }
Result: BinData( 0 x 0000 0000 0000 002 A) // subtype 0
{ $convert: { input: NumberLong(42), to: “binData”, byteOrder: “little” } }
Result: BinData( 0 x 2 A 00 0000 0000 0000 ) // subtype 0
{ $convert: { input: { $toInt: “$myNumericField” }, to: “binData”, byteOrder: “little” } }
假设 myNumericField 为 Int ( 42 )、Long ( 42 ) 或 Double ( 42.0 )...
结果:BinData( 0 x 2 A 00 0000 )
{ $convert: { input: “$myIntOrLongField”, to: “binData”, byteOrder: “little” } }
如果输入为 Int( 42 ):
结果:BinData( 0 x 2 A 00 0000 )
如果输入为长整型 ( 42 ):
BinData( 0 x 2 A 00 0000 0000 0000 )