Menu Docs
Página inicial do Docs
/ / /
Kotlin Coroutine
/ /

Construtores de agregados

Nesta página

  • Visão geral
  • corresponder
  • Projeto
  • Projetando campos computados
  • Documentos
  • Amostra
  • Sort
  • Ignorar
  • Limite
  • Pesquisa
  • Ligação externa esquerda
  • Participação completa e subqueries não correlacionadas
  • Grupo
  • Pick-N Accumulators
  • MinN
  • MaxN
  • FirstN
  • LastN
  • principal
  • TopN
  • Fundo
  • BottomN
  • Unwind
  • Fora
  • Merge
  • GraphLookup
  • SortByCount
  • ReplaceRoot
  • AddFields
  • Contar
  • Balde
  • BucketAuto
  • Facet
  • DefinirWindowFields
  • Densificar
  • Fill
  • Pesquisa de texto completo do Atlas
  • Metadados de Atlas Search

Neste guia, você pode aprender como usar a classeAgregados que fornece métodos de fábrica estáticos que constroem estágios de pipeline de agregação no driver Kotlin MongoDB .

Para uma introdução mais completa à Agregação, consulte nossoGuia de Agregaçãodo .

Os exemplos nesta página pressupõem importações para métodos das seguintes classes:

  • Aggregates

  • Filters

  • Projections

  • Sorts

  • Accumulators

import com.mongodb.client.model.Aggregates
import com.mongodb.client.model.Filters
import com.mongodb.client.model.Projections
import com.mongodb.client.model.Sorts
import com.mongodb.client.model.Accumulators

Use esses métodos para criar estágios de pipeline e especificá-los em sua agregação como uma lista:

val matchStage = Aggregates.match(Filters.eq("someField", "someCriteria"))
val sortByCountStage = Aggregates.sortByCount("\$someField")
val results = collection.aggregate(
listOf(matchStage, sortByCountStage)).toList()

Muitos exemplos do Aggregation neste guia utilizam o conjunto de dados sample_mflix.movies do Atlas. Os documentos nesta coleção são modelados pela seguinte classe de dados Movie para uso com o driver Kotlin:

data class Movie(
val title: String,
val year: Int,
val genres: List<String>,
val rated: String,
val plot: String,
val runtime: Int,
val imdb: IMDB
){
data class IMDB(
val rating: Double
)
}

Dica

Métodos de construtor e propriedades de classe de dados

Você pode usar os métodos de classes de construtores diretamente com propriedades de classe de dados adicionando a dependência opcional de extensões de driver Kotlin ao seu aplicação. Para saber mais e ver exemplos, consulte o guia Use Builders with Data Classes.

Use o método match() para criar um estágio de pipeline $match que faça a correspondência dos documentos recebidos com o filtro de queries especificado, filtrando os documentos que não correspondem.

Dica

O filtro pode ser uma instância de qualquer classe que implemente o Bson , mas é conveniente combinar com o uso da classe Filtros . aula.

O exemplo a seguir cria um estágio de pipeline que corresponde a todos os documento na collection movies em que o campo title é igual a "The Shawshank Redemption":

Aggregates.match(Filters.eq(Movie::title.name, "The Shawshank Redemption"))

Use o método project() para criar um estágio de pipeline $project em que os campos do documento especificados pelo projeto. A projeção de campos em agregação segue as mesmas regras da projeção de campos em queries.

Dica

Embora a projeção possa ser uma instância de qualquer classe que implemente o Bson, é conveniente combinar com o uso de Projeções.

O exemplo a seguir cria um estágio de pipeline que inclui os campos title e plot , mas exclui o campo _id :

Aggregates.project(
Projections.fields(
Projections.include(Movie::title.name, Movie::plot.name),
Projections.excludeId())
)

O estágio $project também pode projetar campos calculados.

O exemplo a seguir cria um estágio de pipeline que projeta o campo rated em um novo campo chamado rating, renomeando efetivamente o campo:

Aggregates.project(
Projections.fields(
Projections.computed("rating", "\$${Movie::rated.name}"),
Projections.excludeId()
)
)

Use o método documents() para criar um estágio de pipeline $documents que retorna documentos literais a partir de valores de entrada.

Importante

Se você usar um estágio $documents em um pipeline de agregação, ele deverá ser o primeiro estágio no pipeline.

O exemplo abaixo cria um estágio de pipeline que gera documentos de amostra na collection movies com um campo title :

Aggregates.documents(
listOf(
Document(Movie::title.name, "Steel Magnolias"),
Document(Movie::title.name, "Back to the Future"),
Document(Movie::title.name, "Jurassic Park")
)
)

Importante

Se você usar o método documents() para fornecer a entrada para uma aggregation pipeline, será necessário chamar o método aggregate() em um banco de dados em vez de em uma collection.

val docsStage = database.aggregate<Document>( // ... )

Use o método sample() para criar um estágio de pipeline $sample para selecionar aleatoriamente documentos da entrada.

O exemplo abaixo cria um estágio de pipeline que seleciona aleatoriamente cinco documentos da coleção movies:

Aggregates.sample(5)

Use o método sort() para criar um estágio de pipeline $sort para classificar de acordo com os critérios especificados.

Dica

Embora os critérios de classificação possam ser uma instância de qualquer classe que implemente Bson, é melhor usar Sorts junto.

O exemplo a seguir cria um estágio de pipeline que classifica em ordem decrescente de acordo com o valor do campo year e, em seguida, em ordem crescente de acordo com o valor do campo title:

Aggregates.sort(
Sorts.orderBy(
Sorts.descending(Movie::year.name),
Sorts.ascending(Movie::title.name)
)
)

Use o método skip() para criar um estágio de pipeline $skip para ignorar o número especificado de documentos antes de passar os documentos para o próximo estágio.

O exemplo a seguir cria um estágio de pipeline que ignora os primeiros documento 5 na collection movies :

Aggregates.skip(5)

Use o estágio do pipeline $limit para limitar o número de documentos passados para o próximo estágio.

O exemplo a seguir cria um estágio de pipeline que limita o número de documento retornados da collection movies para 4:

Aggregates.limit(4)

Use o método lookup() para criar um estágio de pipeline $lookup para realizar fusões e subconsultas não correlacionadas entre duas coleções.

O exemplo abaixo cria um estágio de pipeline que executa uma junção externa esquerda entre as collection movies e comments no reconhecimento de data center de amostra mflix :

  1. Une o campo _id de movies ao campo movie_id em comments

  2. Gera os resultados no campo joined_comments:

Aggregates.lookup(
"comments",
"_id",
"movie_id",
"joined_comments"
)

O exemplo a seguir utiliza a collection orders e warehouses fictícios. Os dados são modelados usando as seguintes classes de dados Kotlin:

data class Order(
@BsonId val id: Int,
val customerId: Int,
val item: String,
val ordered: Int
)
data class Inventory(
@BsonId val id: Int,
val stockItem: String,
val inStock: Int
)

O exemplo cria um estágio de pipeline que une as duas collection pelo item e se a quantidade disponível no campo inStock é suficiente para atender à quantidade ordered :

val variables = listOf(
Variable("order_item", "\$item"),
Variable("order_qty", "\$ordered")
)
val pipeline = listOf(
Aggregates.match(
Filters.expr(
Document("\$and", listOf(
Document("\$eq", listOf("$\$order_item", "\$${Inventory::stockItem.name}")),
Document("\$gte", listOf("\$${Inventory::inStock.name}", "$\$order_qty"))
))
)
),
Aggregates.project(
Projections.fields(
Projections.exclude(Order::customerId.name, Inventory::stockItem.name),
Projections.excludeId()
)
)
)
val innerJoinLookup =
Aggregates.lookup("warehouses", variables, pipeline, "stockData")

Use o método group() para criar um estágio de pipeline $group para agrupar documentos com base em uma determinada expressão e gerar um documento para cada agrupamento distinto.

Dica

O driver inclui a classe Acumuladores com métodos de fábrica estáticos para cada um dos acumuladores suportados.

O exemplo a seguir cria um estágio de pipeline que agrupa documento na collection orders pelo valor do campo customerId . Cada grupo acumula a soma e média dos valores do campo ordered nos campos totalQuantity e averageQuantity :

Aggregates.group("\$${Order::customerId.name}",
Accumulators.sum("totalQuantity", "\$${Order::ordered.name}"),
Accumulators.avg("averageQuantity", "\$${Order::ordered.name}")
)

Saiba mais sobre os operadores acumuladores na seção Manual do servidor em Acumuladores.

Os acumuladores pick-n são operadores de acumulação de agregação que retornam os elementos superiores e inferiores de acordo com uma ordem específica. Use um dos seguintes construtores para criar um operador de acumulação de agregação:

Dica

Você só pode executar operações de agregação com esses acumuladores de pick-n ao executar o MongoDB v5.2 ou posterior.

Saiba com quais pipeline de agregação stages você pode usar operadores acumuladores acessando a seção manual do servidor sobre Acumuladores.

Os exemplos do acumulador do pick-n usam documento da collection do movies no reconhecimento de data center do sample-mflix .

O construtor minN() cria o acumulador $minN que retorna dados de documentos que contêm os n menores valores de um agrupamento.

Dica

Os acumuladores do $minN e $bottomN podem executar tarefas semelhantes. Consulte Comparação de acumuladores de $minN e $bottomN para uso recomendado de cada um.

O exemplo a seguir demonstra como utilizar o método minN() para retornar os valores mais baixos de três imdb.rating para filmes, agrupados por year:

Aggregates.group(
"\$${Movie::year.name}",
Accumulators.minN(
"lowestThreeRatings",
"\$${Movie::imdb.name}.${Movie.IMDB::rating.name}",
3
)
)

Consulte a documentação da API minN() para obter mais informações.

O acumulador maxN() retorna dados de documentos que contêm os n valores mais altos de um agrupamento.

O exemplo a seguir demonstra como usar o método maxN() para retornar os dois maiores valores de imdb.rating para filmes, agrupados por year:

Aggregates.group(
"\$${Movie::year.name}",
Accumulators.maxN(
"highestTwoRatings",
"\$${Movie::imdb.name}.${Movie.IMDB::rating.name}",
2
)
)

Consulte a documentação da API maxN() para obter mais informações.

O acumulador firstN() retorna dados dos primeiros n documentos em cada agrupamento para a ordem de classificação especificada.

Dica

Os acumuladores do $firstN e $topN podem executar tarefas semelhantes. Consulte Comparação dos acumuladores $firstN e $topN para saber o uso recomendado de cada um.

O exemplo a seguir demonstra como usar o método firstN() para retornar os dois primeiros valores de filme title , com base na ordem em que eles entraram no palco, agrupados por year:

Aggregates.group(
"\$${Movie::year.name}",
Accumulators.firstN(
"firstTwoMovies",
"\$${Movie::title.name}",
2
)
)

Consulte a documentação da API firstN() para obter mais informações.

O acumulador lastN() gera dados dos últimos n documentos em cada agrupamento para a ordem de classificação especificada.

O exemplo a seguir demonstra como usar o método lastN() para mostrar os últimos três valores de title de filme, com base na ordem em que eles entraram no palco, agrupados por year:

Aggregates.group(
"\$${Movie::year.name}",
Accumulators.lastN(
"lastThreeMovies",
"\$${Movie::title.name}",
3
)
)

Consulte a documentação da API lastN() para obter mais informações.

O acumulador top() retorna dados do primeiro documento em um grupo com base na ordem de classificação especificada.

O exemplo a seguir demonstra como usar o método top() para retornar os valores title e imdb.rating dos filmes mais bem classificados com base em imdb.rating, agrupados por year.

Aggregates.group(
"\$${Movie::year.name}",
Accumulators.top(
"topRatedMovie",
Sorts.descending("${Movie::imdb.name}.${Movie.IMDB::rating.name}"),
listOf("\$${Movie::title.name}", "\$${Movie::imdb.name}.${Movie.IMDB::rating.name}")
)
)

Consulte a documentação da API top() para obter mais informações.

O acumulador de topN() gera dados de documentos que contêm os valores de n mais altos para o campo especificado.

Dica

Os acumuladores do $firstN e $topN podem executar tarefas semelhantes. Consulte Comparação dos acumuladores $firstN e $topN para saber o uso recomendado de cada um.

O exemplo a seguir demonstra como utilizar o método topN() para retornar os valores title e runtime dos três filmes mais longos com base nos valores runtime, agrupados por year.

Aggregates.group(
"\$${Movie::year.name}",
Accumulators.topN(
"longestThreeMovies",
Sorts.descending(Movie::runtime.name),
listOf("\$${Movie::title.name}", "\$${Movie::runtime.name}"),
3
)
)

Consulte a documentação da API topN() para obter mais informações.

O acumulador bottom() retorna dados do último documento em um grupo com base na ordem de classificação especificada.

O exemplo a seguir demonstra como usar o método bottom() para retornar os valores title e runtime do filme mais curto com base no valor runtime, agrupado por year.

Aggregates.group(
"\$${Movie::year.name}",
Accumulators.bottom(
"shortestMovies",
Sorts.descending(Movie::runtime.name),
listOf("\$${Movie::title.name}", "\$${Movie::runtime.name}")
)
)

Consulte a documentação da API bottom() para obter mais informações.

O acumulador de bottomN() retorna dados de documentos que contêm os valores de n mais baixos para o campo especificado.

Dica

Os acumuladores do $minN e $bottomN podem executar tarefas semelhantes. Consulte Comparação de acumuladores de $minN e $bottomN para uso recomendado de cada um.

O exemplo a seguir demonstra como usar o método bottomN() para retornar os valores title e imdb.rating dos dois filmes com classificação mais baixa com base no valor imdb.rating, agrupados por year:

Aggregates.group(
"\$${Movie::year.name}",
Accumulators.bottom(
"lowestRatedTwoMovies",
Sorts.descending("${Movie::imdb.name}.${Movie.IMDB::rating.name}"),
listOf("\$${Movie::title.name}", "\$${Movie::imdb.name}.${Movie.IMDB::rating.name}"),
)
)

Consulte a documentação da API bottomN() para obter mais informações.

Use o método unwind() para criar um estágio de pipeline $unwind para desconstruir um campo de array a partir de documentos de entrada, criando um documento de saída para cada elemento de array.

O exemplo a seguir cria um documento para cada elemento na array lowestRatedTwoMovies:

Aggregates.unwind("\$${"lowestRatedTwoMovies"}")

Para preservar documentos que têm valores ausentes ou null para o campo de array, ou onde a array está vazia:

Aggregates.unwind(
"\$${"lowestRatedTwoMovies"}",
UnwindOptions().preserveNullAndEmptyArrays(true)
)

Para incluir o índice da array (neste exemplo, em um campo chamado "position"):

Aggregates.unwind(
"\$${"lowestRatedTwoMovies"}",
UnwindOptions().includeArrayIndex("position")
)

Use o método out() para criar um estágio de pipeline $out que grava todos os documentos na coleção especificada no mesmo banco de dados.

Importante

O estágio $out deve ser o último estágio em qualquer pipeline de agregação.

O exemplo a seguir grava os resultados do pipeline na coleção classic_movies :

Aggregates.out("classic_movies")

Use o método merge() para criar um estágio de pipeline $merge que funde todos os documentos na coleção especificada.

Importante

O estágio $merge deve ser o último estágio em qualquer pipeline de agregação.

O exemplo a seguir mescla o pipeline na coleção nineties_movies utilizando as opções padrão:

Aggregates.merge("nineties_movies")

O exemplo a seguir mescla o pipeline na collection movie_ratings no reconhecimento de data center aggregation usando algumas opções não padrão que especificam para substituir o documento se year e title corresponderem, caso contrário, insira o documento:

Aggregates.merge(
MongoNamespace("aggregation", "movie_ratings"),
MergeOptions().uniqueIdentifier(listOf("year", "title"))
.whenMatched(MergeOptions.WhenMatched.REPLACE)
.whenNotMatched(MergeOptions.WhenNotMatched.INSERT)
)

Use o método graphLookup() para criar um estágio de pipeline $graphLookup que executa uma pesquisa recursiva em uma coleção especificada para corresponder a um campo especificado em um documento a um campo especificado de outro documento.

O exemplo a seguir utiliza a coleção contacts . Os dados são modelados usando a seguinte classe de dados Kotlin:

data class Users(
val name: String,
val friends: List<String>?,
val hobbies: List<String>?
)

O exemplo calcula o gráfico de relatórios para usuários na collection contact , fazendo a correspondência recursiva do valor no campo friends com o campo name :

Aggregates.graphLookup(
"contacts",
"\$${Users::friends.name}", Users::friends.name, Users::name.name,
"socialNetwork"
)

Usando GraphLookupOptions, você pode especificar a profundidade a ser recursada e o nome do campo de profundidade, se desejar. Neste exemplo, $graphLookup recursará até duas vezes e criará um campo chamado degrees com as informações de profundidade de recursão para cada documento.

Aggregates.graphLookup(
"contacts",
"\$${Users::friends.name}", Users::friends.name, Users::name.name,
"socialNetwork",
GraphLookupOptions().maxDepth(2).depthField("degrees")
)

Usando GraphLookupOptions, você pode especificar um filtro ao qual os documentos devem corresponder para que o MongoDB os inclua em sua pesquisa. Neste exemplo, apenas links com "golfe" no campo hobbies serão incluídos:

Aggregates.graphLookup(
"contacts",
"\$${Users::friends.name}", Users::friends.name, Users::name.name, "socialNetwork",
GraphLookupOptions().maxDepth(1).restrictSearchWithMatch(
Filters.eq(Users::hobbies.name, "golf")
)
)

Use o método sortByCount() para criar um estágio de pipeline $sortByCount que agrupa documentos por uma determinada expressão e, em seguida, classifica esses grupos por contagem em ordem decrescente.

Dica

O estágio $sortByCount é idêntico a um estágio $group com um acumulador de $sum seguido por um estágio $sort.

[
{ "$group": { "_id": <expression to group on>, "count": { "$sum": 1 } } },
{ "$sort": { "count": -1 } }
]

O exemplo a seguir agrupa documento na collection movies pelo campo genres e calcula a contagem para cada valor distinto:

Aggregates.sortByCount("\$${Movie::genres.name}"),

Use o método replaceRoot() para criar um estágio de pipeline $replaceRoot que substitui cada documento de entrada pelo documento especificado.

O exemplo a seguir utiliza uma collection books fictício que contém dados modelados utilizando a seguinte classe de dados Kotlin:

data class Libro(val titulo: String)
data class Book(val title: String, val spanishTranslation: Libro)

Cada documento de entrada é substituído pelo documento aninhado no campo spanishTranslation :

Aggregates.replaceRoot("\$${Book::spanishTranslation.name}")

Use o método addFields() para criar um estágio de pipeline $addFields que adiciona novos campos a documentos.

Dica

Utilize o $addFields se você não quer a inclusão ou exclusão do campo do projeto.

O exemplo a seguir adiciona dois novos campos, watched e type, aos documentos de entrada na collection movie :

Aggregates.addFields(
Field("watched", false),
Field("type", "movie")
)

Use o método count() para criar um estágio de pipeline $count que conta o número de documentos que entram no estágio e atribui esse valor a um nome de campo especificado. Se você não especificar um campo, count() padronizará o nome do campo para "count".

Dica

O estágio $count é o açúcar sintático para:

{ "$group":{ "_id": 0, "count": { "$sum" : 1 } } }

O exemplo a seguir cria um estágio de pipeline que gera a contagem de documentos recebidos em um campo chamado "total":

Aggregates.count("total")

Use o método bucket() para criar um estágio de pipeline $bucket que automatize o agrupamento de dados em torno de valores de limite predefinidos.

Os exemplos a seguir usam dados modelados com a seguinte classe de dados Kotlin:

data class Screen(
val id: String,
val screenSize: Int,
val manufacturer: String,
val price: Double
)

Este exemplo cria um estágio de pipeline que agrupa os documentos recebidos com base no valor do campo screenSize , incluindo o limite inferior e excluindo o limite superior:

Aggregates.bucket("\$${Screen::screenSize.name}", listOf(0, 24, 32, 50, 70, 1000))

Utilize a classe BucketOptions para especificar um contêiner padrão para valores fora dos limites especificados e para especificar acumuladores adicionais.

O exemplo abaixo cria um estágio de pipeline que agrupa documentos de entrada com base no valor de seu campo screenSize, contando o número de documentos que entram em cada bucket, empurrando o valor de screenSize para um campo chamado matches, e capturando qualquer tamanho de tela maior que "70" em um bucket chamado "monster" para tamanhos de tela monstruosamente grandes:

Dica

O driver inclui a classe Acumuladores com métodos de fábrica estáticos para cada um dos acumuladores suportados.

Aggregates.bucket("\$${Screen::screenSize.name}", listOf(0, 24, 32, 50, 70),
BucketOptions()
.defaultBucket("monster")
.output(
Accumulators.sum("count", 1),
Accumulators.push("matches", "\$${Screen::screenSize.name}")
)
)

Use o método bucketAuto() para criar um estágio de pipeline $bucketAuto que determina automaticamente os limites de cada bucket em sua tentativa de distribuir os documentos uniformemente em um número especificado de buckets.

Os exemplos a seguir usam dados modelados com a seguinte classe de dados Kotlin:

data class Screen(
val id: String,
val screenSize: Int,
val manufacturer: String,
val price: Double
)

Este exemplo cria um estágio de pipeline que tentará criar e distribuir uniformemente documentos em 5 buckets usando o valor de seu campo price :

Aggregates.bucketAuto("\$${Screen::screenSize.name}", 5)

Utilize a classe BucketAutoOptions para especificar um esquema baseado em número preferido para definir valores de limite e especificar acumuladores adicionais.

O exemplo a seguir cria um estágio de pipeline que tentará criar e distribuir uniformemente documentos em 5 blocos usando o valor de seu campo price , definindo os limites de bloco em potências de 2 (2, 4, 8, 16, ...) . Ele também conta o número de documentos em cada bucket e calcula sua price média em um novo campo chamado avgPrice :

Dica

O driver inclui a classe Acumuladores com métodos de fábrica estáticos para cada um dos acumuladores suportados.

Aggregates.bucketAuto(
"\$${Screen::price.name}", 5,
BucketAutoOptions()
.granularity(BucketGranularity.POWERSOF2)
.output(Accumulators.sum("count", 1), Accumulators.avg("avgPrice", "\$${Screen::price.name}"))
)

Use o método facet() para criar um estágio de pipeline $facet que permitirá a definição de pipelines paralelos.

Os exemplos a seguir usam dados modelados com a seguinte classe de dados Kotlin:

data class Screen(
val id: String,
val screenSize: Int,
val manufacturer: String,
val price: Double
)

Este exemplo cria um estágio de pipeline que executa duas agregações paralelas:

  • A primeira agregação distribui documentos recebidos em 5 grupos de acordo com seu campo screenSize.

  • A segunda aggregation conta todos os fabricantes e gera sua contagem, limitada aos 5 principais.

Aggregates.facet(
Facet(
"Screen Sizes",
Aggregates.bucketAuto(
"\$${Screen::screenSize.name}",
5,
BucketAutoOptions().output(Accumulators.sum("count", 1))
)
),
Facet(
"Manufacturer",
Aggregates.sortByCount("\$${Screen::manufacturer.name}"),
Aggregates.limit(5)
)
)

Use o método setWindowFields() para criar um estágio de pipeline $setWindowFields que permite usar operadores de blocos para realizar operações em uma extensão específica de documentos em uma coleção.

Dica

Funções de janela

O driver inclui a classe Windows com métodos de fábrica estáticos para criar cálculos em janela.

O exemplo a seguir utiliza uma collection weather fictício utilizando dados modelados com a seguinte classe de dados Kotlin:

data class Weather(
val localityId: String,
val measurementDateTime: LocalDateTime,
val rainfall: Double,
val temperature: Double
)

O exemplo cria um estágio de tubulação que calcula a precipitação acumulada e a temperatura média no mês passado para cada localidade a partir de medições mais refinadas apresentadas nos campos rainfall e temperature :

val pastMonth = Windows.timeRange(-1, MongoTimeUnit.MONTH, Windows.Bound.CURRENT)
val resultsFlow = weatherCollection.aggregate<Document>(
listOf(
Aggregates.setWindowFields("\$${Weather::localityId.name}",
Sorts.ascending(Weather::measurementDateTime.name),
WindowOutputFields.sum(
"monthlyRainfall",
"\$${Weather::rainfall.name}",
pastMonth
),
WindowOutputFields.avg(
"monthlyAvgTemp",
"\$${Weather::temperature.name}",
pastMonth
)
)
)

Utilize o método densify() para criar um estágio de pipeline $densify que gera uma sequência de documentos para abranger um intervalo especificado.

Dica

Você pode usar o estágio de agregação do $densify() somente ao executar MongoDB v5.1 ou posterior.

Considere os seguintes documentos recuperados do conjunto de dados meteorológicos de amostra do Atlas que contêm medições para um campo position semelhante, espaçados em uma hora:

Document{{ _id=5553a..., position=Document{{type=Point, coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:00:00 EST 1984, ... }}
Document{{ _id=5553b..., position=Document{{type=Point, coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 09:00:00 EST 1984, ... }}

Esses documentos são modelados usando a seguinte classe de dados Kotlin:

data class Weather(
@BsonId val id: ObjectId = ObjectId(),
val position: Point,
val ts: LocalDateTime
)

Suponha que você precise criar um estágio de pipeline que execute as seguintes ações nesses documentos:

  • Adicione um documento a cada intervalo de ts minutos para o qual um valor de ainda não existe.

  • Agrupe os documentos pelo campo position.

A chamada para o construtor de estágio de agregação do densify() que realiza essas ações deve se assemelhar ao seguinte:

Aggregates.densify(
"ts",
DensifyRange.partitionRangeWithStep(15, MongoTimeUnit.MINUTE),
DensifyOptions.densifyOptions().partitionByFields("Position.coordinates")
)

A saída a seguir destaca os documentos gerados pelo estágio agregado que contêm valores ts a cada 15 minutos entre os documentos existentes:

Document{{ _id=5553a..., position=Document{{type=Point, coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:00:00 EST 1984, ... }}
Document{{ position=Document{{coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:15:00 EST 1984 }}
Document{{ position=Document{{coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:30:00 EST 1984 }}
Document{{ position=Document{{coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:45:00 EST 1984 }}
Document{{ _id=5553b..., position=Document{{type=Point, coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 09:00:00 EST 1984, ... }}

Consulte a documentação da API do pacote densify para obter mais informações.

Use o método fill() para criar um estágio de pipeline $fill que preencha null e os valores de campo ausentes.

Dica

Você pode usar o estágio de agregação do $fill() somente ao executar MongoDB v5,3 ou posterior.

Considere os seguintes documentos que contêm medições de temperatura e pressão de ar em um intervalo de hora em hora:

Document{{_id=6308a..., hour=1, temperature=23C, air_pressure=29.74}}
Document{{_id=6308b..., hour=2, temperature=23.5C}}
Document{{_id=6308c..., hour=3, temperature=null, air_pressure=29.76}}

Esses documentos são modelados usando a seguinte classe de dados Kotlin:

data class Weather(
@BsonId val id: ObjectId = ObjectId(),
val hour: Int,
val temperature: String?,
val air_pressure: Double?
)

Suponha que você precisasse preencher os pontos de dados ausentes de temperatura e pressão atmosférica nos documentos da seguinte forma:

  • Preencha o campo air_pressure para hora "2" utilizando interpolação linear para calcular o valor.

  • Defina o valor temperature ausente para " 23.6C " por hora "3".

A chamada para o construtor de estágio de agregação do fill() que realiza estas ações se assemelha ao seguinte:

val resultsFlow = weatherCollection.aggregate<Weather>(
listOf(
Aggregates.fill(
FillOptions.fillOptions().sortBy(Sorts.ascending(Weather::hour.name)),
FillOutputField.value(Weather::temperature.name, "23.6C"),
FillOutputField.linear(Weather::air_pressure.name)
)
)
)
resultsFlow.collect { println(it) }
Weather(id=6308a..., hour=1, temperature=23C, air_pressure=29.74)
Weather(id=6308b..., hour=2, temperature=23.5C, air_pressure=29.75)
Weather(id=6308b..., hour=3, temperature=23.6C, air_pressure=29.76)

Consulte a documentação completa da API do pacote para obter mais informações.

Utilize o método search() para criar um estágio de pipeline $search que especifica uma Full Text Search de um ou mais campos.

Dica

Disponível apenas no Atlas para MongoDB v4.2 e posterior

Esse operador de pipeline de agregação só está disponível para coleções hospedadas em clusters do MongoDB Atlas executando v4.2 ou posterior que são cobertas por um índice de Atlas Search. Saiba mais sobre a configuração necessária e a funcionalidade desse operador na documentação do Atlas Search .

O exemplo abaixo cria um estágio de pipeline que pesquisa no campo title na collection movies o texto que contém a palavra "Future":

Aggregates.search(
SearchOperator.text(
SearchPath.fieldPath(Movie::title.name), "Future"
),
SearchOptions.searchOptions().index("title")
)

Saiba mais sobre os construtores na documentação da API do pacote de pesquisa.

Use o método searchMeta() para criar um estágio de pipeline $searchMeta que retorna somente a parte de metadados dos resultados das queries de Full Text Search do Atlas.

Dica

Disponível apenas no Atlas para MongoDB v4,4,11 e posterior

Este operador de pipeline de agregação só está disponível em clusters do MongoDB Atlas que executam v4.4.11 e posterior. Para uma lista detalhada de disponibilidade de versão, consulte a documentação do MongoDB Atlas em $searchMeta.

O exemplo a seguir mostra os metadados count para um estágio de agregação de pesquisa do Atlas:

Aggregates.searchMeta(
SearchOperator.near(1985, 2, SearchPath.fieldPath(Movie::year.name)),
SearchOptions.searchOptions().index("year")
)

Saiba mais sobre esse assistente na documentação da API searchMeta().

Voltar

Construtores