Funciones de agregación

Agregación

Todas las funciones de agregación se pueden usar como expresiones de nivel superior en la etapa aggregate(...).

Nombre Descripción
COUNT Devuelve la cantidad de documentos.
COUNT_IF Devuelve el recuento de documentos en los que una expresión se evalúa como TRUE.
COUNT_DISTINCT Devuelve el recuento de valores únicos que no son NULL.
SUM Devuelve la suma de todos los valores NUMERIC.
AVERAGE Devuelve el promedio de todos los valores NUMERIC.
MINIMUM Devuelve el valor mínimo que no es NULL.
MAXIMUM Devuelve el valor máximo que no es NULL.
FIRST Devuelve el valor de expression para el primer documento.
LAST Devuelve el valor de expression para el último documento.
ARRAY_AGG Devuelve un array de todos los valores de entrada.
ARRAY_AGG_DISTINCT Devuelve un array de todos los valores de entrada distintos.

COUNT

Sintaxis:

count() -> INT64
count(expression: ANY) -> INT64

Descripción:

Devuelve el recuento de documentos de la etapa anterior en la que expression se evalúa como cualquier valor que no sea NULL. Si no se proporciona ninguna expression, se devuelve el recuento total de documentos de la etapa anterior.

Web

// Total number of books in the collection
const countOfAll = await execute(db.pipeline()
  .collection("books")
  .aggregate(countAll().as("count"))
);

// Number of books with nonnull `ratings` field
const countField = await execute(db.pipeline()
  .collection("books")
  .aggregate(field("ratings").count().as("count"))
);
Swift
// Total number of books in the collection
let countAll = try await db.pipeline()
  .collection("books")
  .aggregate([CountAll().as("count")])
  .execute()

// Number of books with nonnull `ratings` field
let countField = try await db.pipeline()
  .collection("books")
  .aggregate([Field("ratings").count().as("count")])
  .execute()

Kotlin

// Total number of books in the collection
val countAll = db.pipeline()
    .collection("books")
    .aggregate(AggregateFunction.countAll().alias("count"))
    .execute()

// Number of books with nonnull `ratings` field
val countField = db.pipeline()
    .collection("books")
    .aggregate(AggregateFunction.count("ratings").alias("count"))
    .execute()

Java

// Total number of books in the collection
Task<Pipeline.Snapshot> countAll = db.pipeline()
    .collection("books")
    .aggregate(AggregateFunction.countAll().alias("count"))
    .execute();

// Number of books with nonnull `ratings` field
Task<Pipeline.Snapshot> countField = db.pipeline()
    .collection("books")
    .aggregate(AggregateFunction.count("ratings").alias("count"))
    .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Count

# Total number of books in the collection
count_all = (
    client.pipeline().collection("books").aggregate(Count().as_("count")).execute()
)

# Number of books with nonnull `ratings` field
count_field = (
    client.pipeline()
    .collection("books")
    .aggregate(Count("ratings").as_("count"))
    .execute()
)

COUNT_IF

Sintaxis:

count_if(expression: BOOLEAN) -> INT64

Descripción:

Devuelve la cantidad de documentos de la etapa anterior en la que expression se evalúa como TRUE.

Web

const result = await execute(db.pipeline()
  .collection("books")
  .aggregate(
    field("rating").greaterThan(4).countIf().as("filteredCount")
  )
);
Swift
let result = try await db.pipeline()
  .collection("books")
  .aggregate([
    AggregateFunction("count_if", [Field("rating").greaterThan(4)]).as("filteredCount")
  ])
  .execute()

Kotlin

val result = db.pipeline()
    .collection("books")
    .aggregate(
        AggregateFunction.countIf(field("rating").greaterThan(4)).alias("filteredCount")
    )
    .execute()

Java

Task<Pipeline.Snapshot> result = db.pipeline()
    .collection("books")
    .aggregate(
        AggregateFunction.countIf(field("rating").greaterThan(4)).alias("filteredCount")
    )
    .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field

result = (
    client.pipeline()
    .collection("books")
    .aggregate(Field.of("rating").greater_than(4).count_if().as_("filteredCount"))
    .execute()
)

COUNT_DISTINCT

Sintaxis:

count_distinct(expression: ANY) -> INT64

Descripción:

Devuelve la cantidad de valores únicos que no son NULL ni ABSENT de expression.

Web

const result = await execute(db.pipeline()
  .collection("books")
  .aggregate(field("author").countDistinct().as("unique_authors"))
);
Swift
let result = try await db.pipeline()
  .collection("books")
  .aggregate([AggregateFunction("count_distinct", [Field("author")]).as("unique_authors")])
  .execute()

Kotlin

val result = db.pipeline()
    .collection("books")
    .aggregate(AggregateFunction.countDistinct("author").alias("unique_authors"))
    .execute()

Java

Task<Pipeline.Snapshot> result = db.pipeline()
    .collection("books")
    .aggregate(AggregateFunction.countDistinct("author").alias("unique_authors"))
    .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field

result = (
    client.pipeline()
    .collection("books")
    .aggregate(Field.of("author").count_distinct().as_("unique_authors"))
    .execute()
)

SUM

Sintaxis:

sum(expression: ANY) -> NUMBER

Descripción:

Devuelve la suma de todos los valores numéricos, sin tener en cuenta los valores no numéricos. Devuelve NaN si algún valor es NaN.

El resultado tendrá el mismo tipo que el tipo de entrada, excepto en los siguientes casos:

  • Un INTEGER se convertirá en un DOUBLE si no se puede representar como un INTEGER.

Web

const result = await execute(db.pipeline()
  .collection("cities")
  .aggregate(field("population").sum().as("totalPopulation"))
);
Swift
let result = try await db.pipeline()
  .collection("cities")
  .aggregate([Field("population").sum().as("totalPopulation")])
  .execute()

Kotlin

val result = db.pipeline()
    .collection("cities")
    .aggregate(AggregateFunction.sum("population").alias("totalPopulation"))
    .execute()

Java

Task<Pipeline.Snapshot> result = db.pipeline()
    .collection("cities")
    .aggregate(AggregateFunction.sum("population").alias("totalPopulation"))
    .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field

result = (
    client.pipeline()
    .collection("cities")
    .aggregate(Field.of("population").sum().as_("totalPopulation"))
    .execute()
)

AVERAGE

Sintaxis:

average(expression: ANY) -> FLOAT64

Descripción:

Devuelve el promedio de todos los valores numéricos, sin tener en cuenta los valores no numéricos. Se evalúa como NaN si algún valor es NaN, o como NULL si no se agregan valores numéricos.

El resultado tendrá el mismo tipo que el tipo de entrada, excepto en los siguientes casos:

  • Un INTEGER se convertirá en un DOUBLE si no se puede representar como un INTEGER.

Web

const result = await execute(db.pipeline()
  .collection("cities")
  .aggregate(field("population").average().as("averagePopulation"))
);
Swift
let result = try await db.pipeline()
  .collection("cities")
  .aggregate([Field("population").average().as("averagePopulation")])
  .execute()

Kotlin

val result = db.pipeline()
    .collection("cities")
    .aggregate(AggregateFunction.average("population").alias("averagePopulation"))
    .execute()

Java

Task<Pipeline.Snapshot> result = db.pipeline()
    .collection("cities")
    .aggregate(AggregateFunction.average("population").alias("averagePopulation"))
    .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field

result = (
    client.pipeline()
    .collection("cities")
    .aggregate(Field.of("population").average().as_("averagePopulation"))
    .execute()
)

MINIMUM

Sintaxis:

minimum(expression: ANY) -> ANY

Descripción:

Devuelve el valor mínimo que no es NULL ni está ausente de expression cuando se evalúa en cada documento.

Si no hay valores que no sean NULL ni ausentes, se devuelve NULL. Esto incluye los casos en los que no se consideran documentos.

Si hay varios valores equivalentes mínimos, se puede devolver cualquiera de ellos. El orden de los tipos de valor sigue el orden documentado.

Web

const result = await execute(db.pipeline()
  .collection("books")
  .aggregate(field("price").minimum().as("minimumPrice"))
);
Swift
let result = try await db.pipeline()
  .collection("books")
  .aggregate([Field("price").minimum().as("minimumPrice")])
  .execute()

Kotlin

val result = db.pipeline()
    .collection("books")
    .aggregate(AggregateFunction.minimum("price").alias("minimumPrice"))
    .execute()

Java

Task<Pipeline.Snapshot> result = db.pipeline()
    .collection("books")
    .aggregate(AggregateFunction.minimum("price").alias("minimumPrice"))
    .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field

result = (
    client.pipeline()
    .collection("books")
    .aggregate(Field.of("price").minimum().as_("minimumPrice"))
    .execute()
)

MAXIMUM

Sintaxis:

maximum(expression: ANY) -> ANY

Descripción:

Devuelve el valor máximo que no es NULL ni está ausente de expression cuando se evalúa en cada documento.

Si no hay valores que no sean NULL ni ausentes, se devuelve NULL. Esto incluye los casos en los que no se consideran documentos.

Si hay varios valores equivalentes máximos, se puede devolver cualquiera de ellos. El orden de los tipos de valor sigue el orden documentado.

Web

const result = await execute(db.pipeline()
  .collection("books")
  .aggregate(field("price").maximum().as("maximumPrice"))
);
Swift
let result = try await db.pipeline()
  .collection("books")
  .aggregate([Field("price").maximum().as("maximumPrice")])
  .execute()

Kotlin

val result = db.pipeline()
    .collection("books")
    .aggregate(AggregateFunction.maximum("price").alias("maximumPrice"))
    .execute()

Java

Task<Pipeline.Snapshot> result = db.pipeline()
    .collection("books")
    .aggregate(AggregateFunction.maximum("price").alias("maximumPrice"))
    .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field

result = (
    client.pipeline()
    .collection("books")
    .aggregate(Field.of("price").maximum().as_("maximumPrice"))
    .execute()
)

FIRST

Sintaxis:

first(expression: ANY) -> ANY

Descripción:

Devuelve el valor de expression para el primer documento devuelto.

LAST

Sintaxis:

last(expression: ANY) -> ANY

Descripción:

Devuelve el valor de expression para el último documento devuelto.

ARRAY_AGG

Sintaxis:

array_agg(expression: ANY) -> ARRAY<ANY>

Descripción:

Devuelve un array que contiene todos los valores de expression cuando se evalúa en cada documento.

Si la expresión se resuelve en un valor ausente, se convierte en NULL.

El orden de los elementos en el array de salida no es estable y no se debe confiar en él.

ARRAY_AGG_DISTINCT

Sintaxis:

array_agg_distinct(expression: ANY) -> ARRAY<ANY>

Descripción:

Devuelve un array que contiene todos los valores distintos de expression cuando se evalúa en cada documento.

Si la expresión se resuelve en un valor ausente, se convierte en NULL.

El orden de los elementos en el array de salida no es estable y no se debe confiar en él.