Docs Menu
Docs Home
/ /

$bucketAuto (etapa de agregación)

$bucketAuto

Clasifica los documentos entrantes en un número específico de grupos, denominados buckets, según una expresión especificada. Los límites de los buckets se determinan de manera automática con el objetivo de distribuir uniformemente los documentos en el número especificado de buckets.

Cada contenedor se representa como un documento en la salida. El documento de cada contenedor contiene:

  • Un objeto _id que especifica los límites del depósito.

    • El campo _id.min especifica el límite inferior inclusivo para el depósito.

    • El campo _id.max especifica el límite superior del grupo. Este límite es exclusivo para todos los grupos, excepto para el último grupo de la serie, donde es inclusivo.

  • Un campo count que contiene el número de documentos en el bucket. El campo count está incluido por defecto cuando el documento output no está especificado.

El $bucketAuto El escenario tiene la siguiente forma:

{
$bucketAuto: {
groupBy: <expression>,
buckets: <number>,
output: {
<output1>: { <$accumulator expression> },
...
}
granularity: <string>
}
}
Campo
Tipo
Descripción

groupBy

expresión

An expression to group documents by. To specify a field path, prefix the field name with a dollar sign $ and enclose it in quotes.

buckets

entero

Un entero positivo de 32bits que especifica la cantidad de grupos en los que se agrupan los documentos de entrada.

output

Documento

Opcional. Un documento que especifica los campos que se incluirán en los documentos de salida, además del _id campo. Para especificar el campo que se incluirá, se deben usar expresiones de acumulador:

<outputfield1>: { <accumulator>: <expression1> },
...

El campo predeterminado count no se incluye en el documento de salida cuando se especifica output. Especifique explícitamente la expresión count como parte del documento output para incluirla:

output: {
<outputfield1>: { <accumulator>: <expression1> },
...
count: { $sum: 1 }
}

granularity

string

Optional. A string that specifies the preferred number series to use to ensure that the calculated boundary edges end on preferred round numbers or their powers of 10.

Disponible solo si todos los valores groupBy son numéricos y ninguno de ellos es NaN.

Los valores admitidos de granularity son:

  • "R5"

  • "R10"

  • "R20"

  • "R40"

  • "R80"

  • "1-2-5"

  • "E6"

  • "E12"

  • "E24"

  • "E48"

  • "E96"

  • "E192"

  • "POWERSOF2"

La etapa tiene un límite $bucketAuto de 100 megabytes de RAM. De forma predeterminada, si la etapa supera este límite, MongoDB escribe automáticamente archivos temporales en el disco. Para más detalles,allowDiskUseByDefault consulte.

Tip

Puede haber menos del número especificado de depósitos si:

  • La cantidad de documentos de entrada es menor que la cantidad de contenedores especificada.

  • La cantidad de valores únicos de la expresión groupBy es menor que la cantidad especificada de buckets.

  • El granularity tiene menos intervalos que el número de buckets.

  • El granularity no es lo suficientemente fino para distribuir uniformemente los documentos en la cantidad especificada de buckets.

Si la groupBy expresión hace referencia a una matriz o un documento, los valores se organizan utilizando el mismo orden que en antes de determinar los límites del $sort depósito.

La distribución uniforme de los documentos entre los buckets depende de la cardinalidad (o el número de valores únicos) del campo groupBy. Si la cardinalidad no es lo suficientemente alta, la etapa $bucketAuto podría no distribuir los resultados uniformemente entre los buckets.

El parámetro $bucketAuto acepta un granularity parámetro opcional que garantiza que los límites de todos los segmentos se ajusten a una serie numérica preferida. El uso de una serie numérica preferida proporciona mayor control sobre dónde se establecen los límites de los segmentos dentro del rango de valores de la groupBy expresión. También se pueden usar para establecer los límites de los segmentos de forma logarítmica y uniforme cuando el rango de la groupBy expresión escala exponencialmente.

La serie de números de Renard son conjuntos de números derivados al tomar la 5 10 20 40 80 raíz -ésima, -ésima, -ésima, -ésima o -ésima de 10 y luego incluir varias potencias de la raíz que equivalen a valores entre 1.0 y 10.0 10(.3 en el caso R80 de).

Establezca granularity en R5, R10, R20, R40 o R80 para restringir los límites de los segmentos a los valores de la serie. Los valores de la serie se multiplican por una potencia de 10 cuando los valores de groupBy están fuera del rango de 1.0 a 10.0 (10.3 para R80).

Ejemplo

La serie R5 se basa en la raíz quinta de 10, que es 1.58, e incluye varias potencias de esta raíz (redondeadas) hasta llegar a 10. La serie R5 se deriva de la siguiente manera:

  • 10 0/5 = 1

  • 10 1/5 = 1.584 ~ 1.6

  • 10 2/5 = 2.511 ~ 2.5

  • 10 3/5 = 3.981 ~ 4.0

  • 10 4/5 = 6.309 ~ 6.3

  • 10 5/5 = 10

El mismo enfoque se aplica a las demás series Renard para ofrecer una mayor granularidad, es decir, más intervalos entre 1.0 y 10.0 (10.3 para R80).

Las series de números E son similares a las series de Renard en que subdividen el intervalo de 1.0 a 10.0 por 6 la12 ª, 24 ª, 48 ª, 96 ª,ª o 192 ª raíz de diez con un error relativo particular.

Establezca granularity E6E12E24E48en,,,, E96 o E192 para restringir los límites de los intervalos a los valores de la serie. Los valores de la serie se multiplican por una potencia de 10 cuando los groupBy valores de 1 están0 fuera 10 del0 rango de. a.. Para obtener más información sobre la serie E y sus respectivos errores relativos, consulte las series numéricas preferidas.

La 1-2-5 serie se comporta como una serie de Renard de tres valores, si tal serie existiera.

Establezca granularity en 1-2-5 para restringir los límites del depósito a varias potencias de la tercera raíz de 10, redondeadas a un dígito significativo.

Ejemplo

The following values are part of the 1-2-5 series: 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, and so on...

Establezca granularity en POWERSOF2 para restringir los límites del depósito a números que sean una potencia de dos.

Ejemplo

Los siguientes números se adhieren a la serie de potencia de dos:

  • 2 0 = 1

  • 2 1 = 2

  • 2 2 = 4

  • 2 3 = 8

  • 2 4 = 16

  • 2 5 = 32

  • etcétera...

Una implementación común es cómo varios componentes de la computadora, como la memoria, a menudo se adhieren al conjunto POWERSOF2 de números preferidos:

1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, and so on....

The following operation demonstrates how specifying different values for granularity affects how $bucketAuto determines bucket boundaries. A collection of things have an _id numbered from 0 to 99:

{ _id: 0 }
{ _id: 1 }
...
{ _id: 99 }

Se sustituyen diferentes valores para granularity en la siguiente operación:

db.things.aggregate( [
{
$bucketAuto: {
groupBy: "$_id",
buckets: 5,
granularity: <granularity>
}
}
] )

Los resultados en la siguiente tabla demuestran cómo los diferentes valores para granularity producen diferentes límites de segmento:

Granularidad
Resultados
notas

Sin granularidad

{ "_id" : { "min" : 0, "max" : 20 }, "count" : 20 }
{ "_id" : { "min" : 20, "max" : 40 }, "count" : 20 }
{ "_id" : { "min" : 40, "max" : 60 }, "count" : 20 }
{ "_id" : { "min" : 60, "max" : 80 }, "count" : 20 }
{ "_id" : { "min" : 80, "max" : 99 }, "count" : 20 }

R20

{ "_id" : { "min" : 0, "max" : 20 }, "count" : 20 }
{ "_id" : { "min" : 20, "max" : 40 }, "count" : 20 }
{ "_id" : { "min" : 40, "max" : 63 }, "count" : 23 }
{ "_id" : { "min" : 63, "max" : 90 }, "count" : 27 }
{ "_id" : { "min" : 90, "max" : 100 }, "count" : 10 }

E24

{ "_id" : { "min" : 0, "max" : 20 }, "count" : 20 }
{ "_id" : { "min" : 20, "max" : 43 }, "count" : 23 }
{ "_id" : { "min" : 43, "max" : 68 }, "count" : 25 }
{ "_id" : { "min" : 68, "max" : 91 }, "count" : 23 }
{ "_id" : { "min" : 91, "max" : 100 }, "count" : 9 }

1-2-5

{ "_id" : { "min" : 0, "max" : 20 }, "count" : 20 }
{ "_id" : { "min" : 20, "max" : 50 }, "count" : 30 }
{ "_id" : { "min" : 50, "max" : 100 }, "count" : 50 }

El número especificado de cubos excede el número de intervalos en la serie.

PODEROS DE2

{ "_id" : { "min" : 0, "max" : 32 }, "count" : 32 }
{ "_id" : { "min" : 32, "max" : 64 }, "count" : 32 }
{ "_id" : { "min" : 64, "max" : 128 }, "count" : 36 }

El número especificado de cubos excede el número de intervalos en la serie.

Considere una colección artwork con los siguientes documentos:

{ "_id" : 1, "title" : "The Pillars of Society", "artist" : "Grosz", "year" : 1926,
"price" : Decimal128("199.99"),
"dimensions" : { "height" : 39, "width" : 21, "units" : "in" } }
{ "_id" : 2, "title" : "Melancholy III", "artist" : "Munch", "year" : 1902,
"price" : Decimal128("280.00"),
"dimensions" : { "height" : 49, "width" : 32, "units" : "in" } }
{ "_id" : 3, "title" : "Dancer", "artist" : "Miro", "year" : 1925,
"price" : Decimal128("76.04"),
"dimensions" : { "height" : 25, "width" : 20, "units" : "in" } }
{ "_id" : 4, "title" : "The Great Wave off Kanagawa", "artist" : "Hokusai",
"price" : Decimal128("167.30"),
"dimensions" : { "height" : 24, "width" : 36, "units" : "in" } }
{ "_id" : 5, "title" : "The Persistence of Memory", "artist" : "Dali", "year" : 1931,
"price" : Decimal128("483.00"),
"dimensions" : { "height" : 20, "width" : 24, "units" : "in" } }
{ "_id" : 6, "title" : "Composition VII", "artist" : "Kandinsky", "year" : 1913,
"price" : Decimal128("385.00"),
"dimensions" : { "height" : 30, "width" : 46, "units" : "in" } }
{ "_id" : 7, "title" : "The Scream", "artist" : "Munch",
"price" : Decimal128("159.00"),
"dimensions" : { "height" : 24, "width" : 18, "units" : "in" } }
{ "_id" : 8, "title" : "Blue Flower", "artist" : "O'Keefe", "year" : 1918,
"price" : Decimal128("118.42"),
"dimensions" : { "height" : 24, "width" : 20, "units" : "in" } }

En la siguiente operación, los documentos de entrada se agrupan en cuatro grupos según los valores del campo price:

db.artwork.aggregate( [
{
$bucketAuto: {
groupBy: "$price",
buckets: 4
}
}
] )

La operación devuelve los siguientes documentos:

{
"_id" : {
"min" : Decimal128("76.04"),
"max" : Decimal128("159.00")
},
"count" : 2
}
{
"_id" : {
"min" : Decimal128("159.00"),
"max" : Decimal128("199.99")
},
"count" : 2
}
{
"_id" : {
"min" : Decimal128("199.99"),
"max" : Decimal128("385.00")
},
"count" : 2
}
{
"_id" : {
"min" : Decimal128("385.00"),
"max" : Decimal128("483.00")
},
"count" : 2
}

La etapa$bucketAutose puede utilizar dentro de la etapa$facetpara procesar múltiples canales de agregación en el mismo conjunto de documentos de entrada de artwork.

La siguiente pipeline de agregación agrupa los documentos de la colección artwork en cubos basados en price, year y el area calculado:

db.artwork.aggregate( [
{
$facet: {
"price": [
{
$bucketAuto: {
groupBy: "$price",
buckets: 4
}
}
],
"year": [
{
$bucketAuto: {
groupBy: "$year",
buckets: 3,
output: {
"count": { $sum: 1 },
"years": { $push: "$year" }
}
}
}
],
"area": [
{
$bucketAuto: {
groupBy: {
$multiply: [ "$dimensions.height", "$dimensions.width" ]
},
buckets: 4,
output: {
"count": { $sum: 1 },
"titles": { $push: "$title" }
}
}
}
]
}
}
] )

La operación devuelve el siguiente documento:

{
"area" : [
{
"_id" : { "min" : 432, "max" : 500 },
"count" : 3,
"titles" : [
"The Scream",
"The Persistence of Memory",
"Blue Flower"
]
},
{
"_id" : { "min" : 500, "max" : 864 },
"count" : 2,
"titles" : [
"Dancer",
"The Pillars of Society"
]
},
{
"_id" : { "min" : 864, "max" : 1568 },
"count" : 2,
"titles" : [
"The Great Wave off Kanagawa",
"Composition VII"
]
},
{
"_id" : { "min" : 1568, "max" : 1568 },
"count" : 1,
"titles" : [
"Melancholy III"
]
}
],
"price" : [
{
"_id" : { "min" : Decimal128("76.04"), "max" : Decimal128("159.00") },
"count" : 2
},
{
"_id" : { "min" : Decimal128("159.00"), "max" : Decimal128("199.99") },
"count" : 2
},
{
"_id" : { "min" : Decimal128("199.99"), "max" : Decimal128("385.00") },
"count" : 2 },
{
"_id" : { "min" : Decimal128("385.00"), "max" : Decimal128("483.00") },
"count" : 2
}
],
"year" : [
{ "_id" : { "min" : null, "max" : 1913 }, "count" : 3, "years" : [ 1902 ] },
{ "_id" : { "min" : 1913, "max" : 1926 }, "count" : 3, "years" : [ 1913, 1918, 1925 ] },
{ "_id" : { "min" : 1926, "max" : 1931 }, "count" : 2, "years" : [ 1926, 1931 ] }
]
}

Los ejemplos de C# en esta página utilizan la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta Primeros pasos en la documentación del controlador de MongoDB .NET/C#.

La siguiente clase Movie modela los documentos en la colección sample_mflix.movies:

public class Movie
{
public ObjectId Id { get; set; }
public int Runtime { get; set; }
public string Title { get; set; }
public string Rated { get; set; }
public List<string> Genres { get; set; }
public string Plot { get; set; }
public ImdbData Imdb { get; set; }
public int Year { get; set; }
public int Index { get; set; }
public string[] Comments { get; set; }
[BsonElement("lastupdated")]
public DateTime LastUpdated { get; set; }
}

Nota

ConventionPack para Pascal Case

Las clases de C# en esta página utilizan Pascal case para los nombres de sus propiedades, pero los nombres de los campos en la colección de MongoDB utilizan camel case. Para tener en cuenta esta diferencia, se puede usar el siguiente código para registrar un ConventionPack cuando la aplicación se inicie:

var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);

Para utilizar el controlador MongoDB.NET/C# para agregar una $bucketAuto etapa a una canalización de agregación, llame al método BucketAuto() en un PipelineDefinition objeto.

El siguiente ejemplo crea una etapa de pipeline que distribuye uniformemente los documentos en cinco compartimentos según el valor de su campo Runtime:

var pipeline = new EmptyPipelineDefinition<Movie>()
.BucketAuto(
groupBy: m => m.Runtime,
buckets: 5);

Puede usar un objeto AggregateBucketAutoOptions para especificar un esquema numérico preferido para establecer los valores límite. El siguiente ejemplo realiza la misma $bucketAuto operación que el ejemplo anterior, pero también establece los límites del depósito en potencias 2 de:

var bucketAutoOptions = new AggregateBucketAutoOptions()
{
Granularity = new AggregateBucketAutoGranularity("POWERSOF2")
};
var pipeline = new EmptyPipelineDefinition<Movie>()
.BucketAuto(
groupBy: m => m.Runtime,
buckets: 5,
options: bucketAutoOptions);

Los ejemplos de Node.js en esta página utilizan la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte Primeros pasos en la documentación del controlador de MongoDB Node.js.

Para utilizar el controlador de MongoDB Node.js para agregar una etapa de $bucketAuto a una canalización de agregación, utilice el Operador $bucketAuto en un objeto de canalización.

El siguiente ejemplo crea una etapa de canalización que distribuye los documentos uniformemente en cinco grupos según el valor de su campo runtime. A continuación, el ejemplo ejecuta la canalización de agregación:

const pipeline = [
{
$bucketAuto: {
groupBy: "$runtime",
buckets: 5
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

El siguiente ejemplo realiza la misma operación $bucketAuto que el ejemplo anterior, pero establece los límites del depósito como potencias de 2 mediante el parámetro granularity:

const pipeline = [
{
$bucketAuto: {
groupBy: "$runtime",
buckets: 5,
granularity: "POWERSOF2"
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

Para aprender más sobre las etapas relacionadas del pipeline, consulta la guía $bucket.

Volver

$bucket

En esta página