La canalización de agregación es un marco para la agregación de datos, modelado sobre el concepto de canalizaciones de procesamiento de datos.
Para obtener más información sobre la agregación, consulte Canalización de agregación en el manual del servidor.
Requisitos previos
Debe configurar los siguientes componentes para ejecutar los ejemplos de código de esta guía:
A
test.restaurantsColección rellenada con documentos delrestaurants.jsonarchivo en los activos de documentación de GitHub.Las siguientes declaraciones de importación:
import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoCollection; import com.mongodb.reactivestreams.client.MongoDatabase; import com.mongodb.client.model.Aggregates; import com.mongodb.client.model.Accumulators; import com.mongodb.client.model.Projections; import com.mongodb.client.model.Filters; import org.bson.Document;
Importante
Esta guía utiliza implementaciones Subscriber personalizadas, que se describen en la Guíade implementación de suscriptores personalizados de muestra.
Conectarse a una implementación de MongoDB
Primero, conéctese a una implementación de MongoDB, luego declare y defina las instancias MongoDatabase y MongoCollection.
El siguiente código se conecta a una implementación independiente de MongoDB que se ejecuta en localhost, en el puerto 27017. Luego, define la variable database para referirse a la base de datos test y la variable collection para referirse a la colección restaurants:
MongoClient mongoClient = MongoClients.create(); MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("restaurants");
Para obtener más información sobre cómo conectarse a implementaciones de MongoDB, consulte el tutorial Conectarse a MongoDB.
Realizar agregación
Para realizar la agregación, pase una lista de etapas de agregación al método MongoCollection.aggregate(). El controlador proporciona la clase auxiliar Aggregates, que contiene los constructores para las etapas de agregación.
En este ejemplo, la canalización de agregación realiza las siguientes tareas:
Utiliza una etapa
$matchpara filtrar documentos cuyo campo de matrizcategoriescontiene el elemento"Bakery". El ejemplo utilizaAggregates.match()para generar la etapa$match.
Utiliza una etapa
$grouppara agrupar los documentos coincidentes por el campostars, acumulando un recuento de documentos para cada valor distinto destars. El ejemplo utilizaAggregates.group()para generar la etapa$groupyAccumulators.sum()para generar la expresión del acumulador. Para las expresiones del acumulador que se utilizan en la etapa$group, el controlador proporciona la clase auxiliarAccumulators.
collection.aggregate( Arrays.asList( Aggregates.match(Filters.eq("categories", "Bakery")), Aggregates.group("$stars", Accumulators.sum("count", 1)) ) ).subscribe(new PrintDocumentSubscriber());
Usar expresiones de agregación
Para las expresiones de acumulador $group, el controlador proporciona la clase auxiliar Accumulators. Para otras expresiones de agregación, genere manualmente la expresión con la clase Document.
En el siguiente ejemplo, la canalización de agregación utiliza una etapa $project para devolver únicamente el campo name y el campo calculado firstCategory, cuyo valor es el primer elemento de la matriz categories. El ejemplo utiliza Aggregates.project() y varios métodos de clase Projections para construir la etapa $project:
collection.aggregate( Arrays.asList( Aggregates.project( Projections.fields( Projections.excludeId(), Projections.include("name"), Projections.computed( "firstCategory", new Document("$arrayElemAt", Arrays.asList("$categories", 0)) ) ) ) ) ).subscribe(new PrintDocumentSubscriber());
Explicar una agregación
Para $explain una canalización de agregación, llame al método AggregatePublisher.explain():
collection.aggregate( Arrays.asList( Aggregates.match(Filters.eq("categories", "Bakery")), Aggregates.group("$stars", Accumulators.sum("count", 1)))) .explain() .subscribe(new PrintDocumentSubscriber());
MongoDB búsqueda
Puede realizar una consulta de búsqueda de MongoDB creando y ejecutando una canalización de agregación que contenga una de las siguientes etapas de canalización:
$search$searchMeta
El controlador Java Reactive Streams proporciona los métodos Aggregates.search() y Aggregates.searchMeta() para realizar consultas de búsqueda de MongoDB.
Para obtener más información sobre las etapas de la canalización de búsqueda de MongoDB, consulte Elegir la etapa de la canalización de agregación en la documentación de Atlas.
Crear etapas de búsqueda de canalización
Puede crear los criterios de búsqueda en su etapa de canalización de búsqueda de MongoDB utilizando operadores de búsqueda.
El controlador Java Reactive Streams proporciona métodos auxiliares para los siguientes operadores:
Operador | Descripción |
|---|---|
Realiza una búsqueda de una palabra o frase que contenga una secuencia de caracteres de una cadena de entrada incompleta. | |
Combina dos o más operadores en una sola consulta. | |
Comprueba si un campo coincide con el valor especificado. Se asigna a los métodos | |
Comprueba si existe una ruta a un nombre de campo indexado específico en un documento. | |
Realiza una búsqueda de una matriz de valores BSON de número, fecha, booleano, objectId, uuid o cadena en la ruta indicada y devuelve documentos donde el valor del campo es igual a cualquier valor en la matriz especificada. | |
Devuelve documentos similares a los documentos de entrada. | |
Admite la consulta y puntuación de valores numéricos, de fecha y de puntos GeoJSON. | |
Realiza una búsqueda de documentos que contienen una secuencia ordenada de términos utilizando el analizador especificado en la configuración del índice. | |
Brinda soporte a las queries de una combinación de campos indexados y valores. | |
Admite la consulta y puntuación de valores numéricos, de fecha y de cadena. Se asigna a los métodos | |
Interpreta el campo de consulta como una expresión regular. | |
Realiza una búsqueda de texto completo utilizando el analizador que especifique en la configuración del índice. | |
Permite consultas que utilizan caracteres especiales en la cadena de búsqueda que pueden coincidir con cualquier carácter. |
Ejemplo de etapa de búsqueda en el pipeline
Nota
Conjunto de datos de muestra del Atlas
Este ejemplo utiliza la colección sample_mflix.movies de los conjuntos de datos de muestra de Atlas. Para aprender cómo configurar un clúster de Atlas de nivel gratuito y cargar el conjunto de datos de muestra, consulta el tutorial Empezar con Atlas en la documentación de Atlas.
Antes de poder ejecutar este ejemplo, debe crear un índice de búsqueda de MongoDB en la colección movies que tenga la siguiente definición:
{ "mappings": { "dynamic": true, "fields": { "title": { "analyzer": "lucene.keyword", "type": "string" }, "genres": { "normalizer": "lowercase", "type": "token" } } } }
Para obtener más información sobre cómo crear índices de Búsqueda de MongoDB, consulte la sección Gestión del índice de búsqueda de MongoDB de la guía de índices.
El siguiente código crea una etapa $search que tiene las siguientes especificaciones:
Comprueba que la matriz
genresincluye"Comedy"Busca en el campo
fullplotla frase"new york"Coincide con
yearvalores entre1950y2000, inclusiveBusca
titlevalores que comiencen con el término"Love"
Bson searchStageFilters = Aggregates.search( SearchOperator.compound() .filter( List.of( SearchOperator.in(fieldPath("genres"), List.of("Comedy")), SearchOperator.phrase(fieldPath("fullplot"), "new york"), SearchOperator.numberRange(fieldPath("year")).gtLt(1950, 2000), SearchOperator.wildcard(fieldPath("title"), "Love *") ))); Bson projection = Aggregates.project(Projections.fields( Projections.include("title", "year", "genres") )); List<Bson> aggregateStages = List.of(searchStageFilters, projection); Publisher<Document> publisher = movies.aggregate(aggregateStages); publisher.subscribe(new SubscriberHelpers.PrintDocumentSubscriber()); Mono.from(publisher).block();
{"_id": ..., "genres": ["Comedy", "Romance"], "title": "Love at First Bite", "year": 1979} {"_id": ..., "genres": ["Comedy", "Drama"], "title": "Love Affair", "year": 1994}
Para obtener más información sobre los métodos auxiliares de búsqueda de MongoDB, consulte la referencia de la interfaz SearchOperator en la documentación de la API de Driver Core.
Información Adicional
Para obtener una lista completa de las etapas de agregación, consulta Etapas de agregación en el manual de MongoDB Server.
Para obtener más información sobre cómo ensamblar una canalización de agregación y ver ejemplos, consulte Canalización de agregación en el manual de MongoDB Server.
Para obtener más información sobre cómo explicar las operaciones de MongoDB, consulte Explicar los planes de salida y consulta en el manual del servidor MongoDB.
Documentación de la API
Para obtener más información sobre las clases y los métodos mencionados en esta guía, consulte la siguiente documentación de API: