Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /
Etapas de la pipeline de agregación

$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 segmento de bucket se representa como un documento en la salida. El documento de cada bucket contiene:

  • Un objeto _id que especifica los límites del bucket.

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

    • El campo _id.max especifica el límite superior del contenedor. Este límite es exclusivo para todos los búkets excepto el final 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.

La etapa $bucketAuto tiene el siguiente formato:

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

groupBy

expresión

An expresión por la que agrupar los documentos. Para especificar una ruta de campo, antepone el nombre del campo con un signo de dólar $ y encierra el nombre del campo entre comillas.

buckets

entero

Un entero positivo de 32 bits que especifica el número de compartimientos en los que se agrupan los documentos de entrada.

output

Documento

opcional. Un documento que especifica los campos que se deben incluir en los documentos de salida además del campo _id. Para especificar el campo a incluir, debes utilizar expresiones acumuladoras:

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

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

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

granularity

string

opcional. Una string que especifica la serie numérica preferida para usar y garantizar que los bordes límite calculados terminen en números redondos preferidos o en sus potencias de 10.

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

Los valores compatibles de granularity son:

  • "R5"

  • "R10"

  • "R20"

  • "R40"

  • "R80"

  • "1-2-5"

  • "E6"

  • "E12"

  • "E24"

  • "E48"

  • "E96"

  • "E192"

  • "POWERSOF2"

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

Tip

Puede haber menos cantidad de cubetas que la especificada si:

  • El número de documentos de entrada es menor que el número de buckets especificado.

  • El número de valores exclusivos de la expresión groupBy es menor que el número especificado 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 el número especificado de buckets.

Si la expresión groupBy se refiere a un arreglo o a un documento, los valores se organizan utilizando el mismo orden que en $sort antes de determinar los límites de los intervalos.

La distribución uniforme de documentos en 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 puede no distribuir uniformemente los resultados en los buckets.

El $bucketAuto acepta un parámetro granularity opcional que se asegura de que los límites de todos los buckets se adhieran a una serie de números preferidos especificada. Usar una serie de números preferida proporciona más control sobre dónde se establecen los límites de los grupos dentro del rango de valores en la expresión groupBy. También pueden utilizarse para ayudar a establecer logarítmicamente y de manera uniforme los límites de los buckets cuando el rango de la expresión de groupBy escala exponencialmente.

Las series numéricas de Renard son conjuntos de números derivados al tomar la raíz 5 ta, 10 ma, 20 ma, 40 ma u 80 ma de 10, e incluir luego varias potencias de esa raíz, que equivalen a valores entre 1,0 y 10,0 (10,3 en el caso de R80).

Establezca granularity en R5, R10, R20, R40 o R80 para restringir los límites de los cubos a 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 R5 serie se basa en la quinta raíz de 10, que es 1,58, e incluye varias potencias de esta raíz (aproximadas) 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).

La serie de números E es similar a la serie Renard en que subdivide el intervalo de 1.0 a 10.0 mediante la raíz 6 ma, 12 va, 24 na, 48 ma, 96 va o 192 da de diez con un error relativo particular.

Establece granularity en E6, E12, E24, E48, E96 o E192 para restringir los límites del bucket a valores dentro 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 1.0 a 10.0. Para aprender más sobre la serie E y sus respectivos errores relativos, consulta series de números preferidas.

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

Configure granularity en 1-2-5 para restringir los límites del bucket a varias potencias de la raíz cúbica de 10, redondeadas a un dígito significativo.

Ejemplo

Los siguientes valores forman parte de la serie 1-2-5: 0,1, 0,2, 0,5, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, y así sucesivamente...

Configura granularity en POWERSOF2 para restringir los límites del bucket a números que sean potencias de dos.

Ejemplo

Los siguientes números se adhieren a la Serie de potencias de dos:

  • 2 0 = 1

  • 2 1 = 2

  • 2 2 = 4

  • 2 3 = 8

  • 2 4 = 16

  • 2 5 = 32

  • y así sucesivamente...

Una implementación común es cómo varios componentes de ordenador, como la memoria, a menudo cumplen con el POWERSOF2 conjunto de números preferidos:

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

La siguiente operación demuestra cómo la especificación de valores diferentes para granularity afecta la forma en que $bucketAuto determina los límites de los buckets. Una colección de things tienen un _id numerados del 0 al 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 diferentes valores para granularity producen diferentes límites de grupo:

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 buckets excede el número de intervalos en la serie.

POTENCIASDE2

{ "_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 buckets excede el número de intervalos en la serie.

Considera 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 cubos según los valores en el 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 $bucketAuto se puede utilizar dentro de la etapa $facet para procesar multiples pipelines 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 driver MongoDB .NET/C# para añadir una etapa $bucketAuto a una pipeline de agregación, llama al método BucketAuto() en un objeto PipelineDefinition.

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);

Puedes utilizar un objeto AggregateBucketAutoOptions para especificar un esquema basado en número preferido para establecer valores límite. El siguiente ejemplo realiza la misma operación de $bucketAuto que el ejemplo anterior, pero también establece los límites de los cubos en potencias de 2:

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 pipeline que distribuye uniformemente los documentos en cinco grupos según el valor de su campo runtime. El ejemplo luego ejecuta la pipeline 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 de $bucketAuto que el ejemplo anterior, pero establece los límites del bucket como potencias de 2 usando 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