$bucketAuto
¶3.4版的新功能。
根据指定的表达式将传入文档分类为特定数量的组,称为存储桶。自动确定存储区边界,以尝试将文档平均分配到指定数量的存储区中。
每个存储段在输出中均表示为文档。每个存储桶的文档包含一个_id
字段,该字段的值指定存储桶的包含下限和专有上限,以及一个count
包含存储桶中文档数的字段。未指定count
时,默认情况下会包含此字段
output
。
该$bucketAuto
阶段具有以下形式:
领域 | 类型 | 描述 | ||
---|---|---|---|---|
groupBy |
表达 | 用于分组文档的表达式。要指定字段路径,请在字段名称前加一个美元符号$ ,并将其括在引号中。 |
||
buckets |
整数 | 一个正的32位整数,指定输入文档被分组到的存储桶数。 | ||
output |
文献 | 可选的。一个文档,它指定除字段外还要包含在输出文档中的 指定时,默认 |
||
granularity |
串 | 可选的。一个字符串,它指定用于确保计算的边界边以首选的整数或其幂为10结束的首选数字序列。 仅当所有 支持的值为
|
在以下情况下,可能少于指定数量的存储桶:
groupBy
表达式的唯一值的数量小于的指定数量buckets
。granularity
间隔少于的数量
buckets
。granularity
不精不足以文件均匀地分配到指定数量buckets
。如果groupBy
表达式引用数组或文档,则使用与$sort
确定存储段边界之前相同的顺序来排列值。
文档在存储桶中的平均分配取决于groupBy
字段的基数或唯一值的数量。如果基数不够高,则$ bucketAuto阶段可能无法在存储桶之间平均分配结果。
在$bucketAuto
接受一个可选granularity
参数,其确保所有桶的边界附着到指定的
优选数系列。使用首选的数字系列可以更好地控制在groupBy
表达式中值范围内设置存储桶边界的位置。当groupBy
表达式的范围呈指数比例缩放时,它们也可以用于对数帮助均匀地设置存储桶边界。
雷纳德数系列是一组通过采取任一5衍生的号码的第 10 日,20 日,40 日或80 日的10根,则包括根的各种权力,等同于10.0 1.0之间的值(10.3在的情况R80
)。
设置granularity
到R5
,R10
,R20
,R40
,或R80
限制斗边界序列值。当序列的groupBy
值超出1.0到10.0的R80
范围(对于,则为10.3 )时,将其乘以10的幂。
例
该R5
系列基于10的第五根(即1.58),并包括该根的各种幂(四舍五入),直到达到10。该R5
系列的推导如下:
将相同的方法应用于其他Renard系列,以提供更精细的粒度,即,在1.0和10.0之间有更大的间隔(对于则为10.3
R80
)。
对E数系列类似于 雷纳德系列的,因为它们通过细分为1.0的间隔至10.0的6 个,12 个,24 个,48 个,96 个,或192 次与特定相对误差根十个。
设置granularity
到E6
,E12
,E24
,E48
,E96
,或
E192
限制斗边界序列值。当序列的groupBy
值在1.0到10.0范围之外时,乘以10的幂
。要了解有关E系列及其各自相对误差的更多信息,请参阅
首选数字系列。
如果存在该序列,则该1-2-5
序列的行为类似于三值
Renard序列。
设置granularity
为1-2-5
将存储段边界限制为10的三进制根的各种幂,四舍五入到一位有效数字。
例
以下是该1-2-5
系列的一部分:0.1、0.2、0.5、1、2、5、10、20、50、100、200、500、1000,依此类推…
设置granularity
为POWERSOF2
将存储段边界限制为2的幂。
例
以下数字遵循两个系列的功能:
一个常见的实现是各种计算机组件(例如内存)如何经常遵循一POWERSOF2
组首选数字:
1,2,4,8,16,32,64,128,256,512,1024,2048等...
以下操作演示了如何为指定不同的值granularity
如何影响$bucketAuto
确定存储桶边界的方式。集合things
的_id
编号从1到100:
的不同值granularity
代入以下操作:
下表中的结果说明了不同的值如何
granularity
产生不同的存储区边界:
粒度 | 结果 | 笔记 |
---|---|---|
没有粒度 | {“ _id”:{“ min”:0,“ max”:20},“ count”:20}
{“ _id”:{“最小”:20,“最大”:40},“计数”:20}
{“ _id”:{“最小”:40,“最大”:60},“计数”:20}
{“ _id”:{“最小”:60,“最大”:80},“计数”:20}
{“ _id”:{“最小”:80,“最大”:99},“计数”:20}
|
|
R20 | {“ _id”:{“ min”:0,“ max”:20},“ count”:20}
{“ _id”:{“最小”:20,“最大”:40},“计数”:20}
{“ _id”:{“最小”:40,“最大”:63},“计数”:23}
{“ _id”:{“最小”:63,“最大”:90},“计数”:27}
{“ _id”:{“最小”:90,“最大”:100},“计数”:10}
|
|
E24 | {“ _id”:{“ min”:0,“ max”:20},“ count”:20}
{“ _id”:{“最小”:20,“最大”:43},“计数”:23}
{“ _id”:{“最小”:43,“最大”:68},“计数”:25}
{“ _id”:{“ min”:68,“ max”:91},“ count”:23}
{“ _id”:{“最小”:91,“最大”:100},“计数”:9}
|
|
1-2-5 | {“ _id”:{“ min”:0,“ max”:20},“ count”:20}
{“ _id”:{“最小”:20,“最大”:50},“计数”:30}
{“ _id”:{“最小”:50,“最大”:100},“计数”:50}
|
指定的存储桶数超出了序列中的间隔数。 |
POWERSOF2 | {“ _id”:{“ min”:0,“ max”:32},“ count”:32}
{“ _id”:{“最小”:32,“最大”:64},“计数”:32}
{“ _id”:{“最小”:64,“最大”:128},“计数”:36}
|
指定的存储桶数超出了序列中的间隔数。 |
考虑artwork
包含以下文档的集合:
该$bucketAuto
阶段可在该
$facet
阶段内用于处理来自的同一组输入文档上的多个聚合管道artwork
。
下面聚集管道组从文件
artwork
收集到水桶基础上price
,year
并且计算的area
:
该操作返回以下文档: