Docs 菜单
Docs 主页
/
MongoDB Atlas
/ /

$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
binDataintlongdoublestring
必需
要转换为intlongdoublestring类型的二进制数据,或要转换的intlongdoublestring类型数据为二进制数据。
to
binDataintlongdoublestring
必需
指定input转换后的数据类型。您可以指定为intlongdoublestringbinData
byteOrder
小,大
必需

指定binData输入和输出的大端字节序或小端字节序。如果未指定,则默认为小端字节顺序。

注意

byteOrder 选项指定如何解释输入或输出binData ,但不控制数字类型的内部字节顺序。 MongoDB建议您使用大端排序,这是Kafka生态系统、 Java和Python语言中数字到字节转换的默认排序。

format
base64, base64url, hex, uuid, utf8
必需

指定string输入和输出的顶级格式参数。

注意

默认, $toString辅助方法不会将binData解释为 utf- 8数据。默认为base64 。您必须使用 $convert表达式进行 utf- 8转换。

如果$convert.to的值为int ,则binData input值必须为124 。如果$convert.to的值为long ,则binData input值必须为1248 。如果input的长度超出预期,则会产生错误。您可以通过配置$convert.onError来控制此行为。

转换为binData时, int变为4字节binDatalong变为8字节binDatadouble变为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表达式,它们跨BinDataintlongdouble表示法转换值:

{
$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 )

后退

聚合表达式