定义
8.2版本新增。
对值窗口内的数值表达式进行规范化。默认下,值的范围可以范围0 和 1 之间。最小值变为零,最大值变为 1,所有其他值在 0 和 1 之间按比例扩展。您还可以指定规范化输出范围的自定义最小值和最大值。
$minMaxScaler
仅在$setWindowFields
阶段可用。
$minMaxScaler
窗口运算符符的语法如下:
{ $minMaxScaler: <numeric expression> }
该值可以是:
一个数值表达式,即要规范化的值。它可以是特定的数字字段或根据文档计算的值。
采用以下格式的文档:
{ input: <numeric expression>, min: <constant numeric expression>, max: <constant numeric expression> } 字段说明input
数值表达式,其中包含要规范化的值。
min
您希望在输出中出现的最小值。如果省略,则默认为
0
。max
您希望在输出中出现的最大值。如果省略,则默认为
1
。
行为
$minMaxScaler
使用以下公式对数值表达式进行规范化:
minMaxScaler(x, min, max) = ((x - min(X)) / (max(X) - min(X))) * (max - min) + min
其中:
| 要标准化的值。 |
| 所需的输出最小值。 |
| 所需的输出最大值。 |
| 范围中的最小值。 |
| 范围中的最大值。 |
$minMaxScaler
如果input
值为以下任一值,则 会返回错误:
Non-numeric
null
空数组
字符串
示例
假设集合中的文档有一个名为 a
的字段,其值如下:
{ "_id": 1, "a": 1 } { "_id": 2, "a": 5 } { "_id": 3, "a": 13 } { "_id": 4, "a": 21 }
考虑以下管道阶段和输出:
db.example.aggregate([ {$setWindowFields: { sortBy: {a: 1}, output: { scaled: {$minMaxScaler: "$a"}, scaledTo100: {$minMaxScaler: {input: "$a", min: 0, max: 100}}, } }} ])
{a: 1, scaled: 0, scaledTo100: 0} {a: 5, scaled: 0.2, scaledTo100: 20} {a: 13, scaled: 0.6, scaledTo100: 60} {a: 21, scaled: 1, scaledTo100: 100}
在前面的示例中,管道使用$minMaxScaler
计算两个换算后的值:
scaled
,这会对扩展应用默认值0
和1
。scaledTo100
,它将0
和100
之间的范围应用于扩展。
输出显示a
的原始值和两个缩放后的值。$minMaxScaler
将以下内容用于文档,其中min(X)
为1
,max(X)
为21
(根据文档计算得出),以返回换算后的值:
{a: 1}
scaled = ((1 - 1) / (21 - 1)) * (1 - 0) + 0 = 0 scaledTo100 = ((1 - 1) / (21 - 1)) * (100 - 0) + 0 = 0
{a: 5}
scaled = ((5 - 1) / (21 - 1)) * (1 - 0) + 0 = (4 / 20) * 1 + 0 = 0.2 scaledTo100 = ((5 - 1) / (21 - 1)) * (100 - 0) + 0 = (4 / 20) * 100 + 0 = 20
{a: 13}
scaled = ((13 - 1) / (21 - 1)) * (1 - 0) + 0 = (12 / 20) * 1 + 0 = 0.6 scaledTo100 = ((13 - 1) / (21 - 1)) * (100 - 0) + 0 = (12 / 20) * 100 + 0 = 60
{a: 21}
scaled = ((21 - 1) / (21 - 1)) * (1 - 0) + 0 = (20 / 20) * 1 + 0 = 1 scaledTo100 = ((21 - 1) / (21 - 1)) * (100 - 0) + 0 = (20 / 20) * 100 + 0 = 100