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