Overview
Esta guía proporciona ejemplos de cómo utilizar pipelines de agregación.
Tip
Tutoriales completos sobre agregación
Puedes encontrar tutoriales que proporcionan explicaciones detalladas de tareas de agregación comunes en el Tutoriales completos del pipeline de agregación en el manual del servidor. Selecciona un tutorial y luego elige Java (Sync) en el menú desplegable Select your language en la esquina superior derecha de la página.
Importar clases
Crea un nuevo archivo Java llamado AggTour.java e incluya las siguientes instrucciones de importación:
import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.ExplainVerbosity; import com.mongodb.client.model.Accumulators; import com.mongodb.client.model.Aggregates; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Projections; import org.bson.Document; import org.bson.json.JsonWriterSettings; import java.util.Arrays; import java.util.List;
Conecta a una implementación de MongoDB
public class AggTour { public static void main(String[] args) { // Replace the uri string with your MongoDB deployment's connection string String uri = "<connection string>"; MongoClient mongoClient = MongoClients.create(uri); MongoDatabase database = mongoClient.getDatabase("aggregation"); MongoCollection<Document> collection = database.getCollection("restaurants"); // Paste the aggregation code here } }
Tip
Para obtener más información sobre cómo conectarse a MongoDB, consulte la Guía de conexión.
Insertar datos de muestra
collection.insertMany(Arrays.asList( new Document("name", "Sun Bakery Trattoria").append("contact", new Document().append("phone", "386-555-0189").append("email", "SunBakeryTrattoria@example.org").append("location", Arrays.asList(-74.0056649, 40.7452371))).append("stars", 4).append("categories", Arrays.asList("Pizza", "Pasta", "Italian", "Coffee", "Sandwiches")), new Document("name", "Blue Bagels Grill").append("contact", new Document().append("phone", "786-555-0102").append("email", "BlueBagelsGrill@example.com").append("location", Arrays.asList(-73.92506, 40.8275556))).append("stars", 3).append("categories", Arrays.asList("Bagels", "Cookies", "Sandwiches")), new Document("name", "XYZ Bagels Restaurant").append("contact", new Document().append("phone", "435-555-0190").append("email", "XYZBagelsRestaurant@example.net").append("location", Arrays.asList(-74.0707363, 40.59321569999999))).append("stars", 4).append("categories", Arrays.asList("Bagels", "Sandwiches", "Coffee")), new Document("name", "Hot Bakery Cafe").append("contact", new Document().append("phone", "264-555-0171").append("email", "HotBakeryCafe@example.net").append("location", Arrays.asList(-73.96485799999999, 40.761899))).append("stars", 4).append("categories", Arrays.asList("Bakery", "Cafe", "Coffee", "Dessert")), new Document("name", "Green Feast Pizzeria").append("contact", new Document().append("phone", "840-555-0102").append("email", "GreenFeastPizzeria@example.com").append("location", Arrays.asList(-74.1220973, 40.6129407))).append("stars", 2).append("categories", Arrays.asList("Pizza", "Italian")), new Document("name", "ZZZ Pasta Buffet").append("contact", new Document().append("phone", "769-555-0152").append("email", "ZZZPastaBuffet@example.com").append("location", Arrays.asList(-73.9446421, 40.7253944))).append("stars", 0).append("categories", Arrays.asList("Pasta", "Italian", "Buffet", "Cafeteria")), new Document("name", "XYZ Coffee Bar").append("contact", new Document().append("phone", "644-555-0193").append("email", "XYZCoffeeBar@example.net").append("location", Arrays.asList(-74.0166091, 40.6284767))).append("stars", 5).append("categories", Arrays.asList("Coffee", "Cafe", "Bakery", "Chocolates")), new Document("name", "456 Steak Restaurant").append("contact", new Document().append("phone", "990-555-0165").append("email", "456SteakRestaurant@example.com").append("location", Arrays.asList(-73.9365108, 40.8497077))).append("stars", 0).append("categories", Arrays.asList("Steak", "Seafood")), new Document("name", "456 Cookies Shop").append("contact", new Document().append("phone", "604-555-0149").append("email", "456CookiesShop@example.org").append("location", Arrays.asList(-73.8850023, 40.7494272))).append("stars", 4).append("categories", Arrays.asList("Bakery", "Cookies", "Cake", "Coffee")), new Document("name", "XYZ Steak Buffet").append("contact", new Document().append("phone", "229-555-0197").append("email", "XYZSteakBuffet@example.org").append("location", Arrays.asList(-73.9799932, 40.7660886))).append("stars", 3).append("categories", Arrays.asList("Steak", "Salad", "Chinese")) ));
Ejemplo básico de agregación
Para realizar una agregación, pase una lista de etapas de agregación al método MongoCollection.aggregate().
El controlador de Java proporciona los Agregados clase asistente que contiene desarrolladores para etapas de agregación.
En el siguiente ejemplo, el pipeline de agregación:
Utiliza una etapa $match para filtrar documentos cuyo campo de tipo arreglo
categoriescontenga el elementoBakery. El ejemplo utilizaAggregates.matchpara compilar la etapa$match.Usa una etapa $group para agrupar los documentos coincidentes por el campo
stars, acumulando un recuento de documentos para cada valor distinto destars.
Nota
Puedes compilar las expresiones usadas en este ejemplo utilizando los desarrolladores de agregación.
collection.aggregate( Arrays.asList( Aggregates.match(Filters.eq("categories", "Bakery")), Aggregates.group("$stars", Accumulators.sum("count", 1)) ) // Prints the result of the aggregation operation as JSON ).forEach(doc -> System.out.println(doc.toJson()));
La agregación anterior genera los siguientes resultados:
{"_id": 4, "count": 2} {"_id": 5, "count": 1}
Para obtener más información sobre los métodos y clases mencionados en esta sección, consulte la siguiente documentación de la API:
Explicar ejemplo de agregación
Para ver información sobre cómo MongoDB ejecuta tu operación, utiliza el método explain() de la clase AggregateIterable. El método explain() devuelve planes de ejecución y estadísticas de rendimiento. Un plan de ejecución es una forma potencial en que MongoDB puede completar una operación. El método explain() proporciona tanto el plan ganador, que es el plan que MongoDB ejecutó, como cualquier plan rechazado.
Tip
Para obtener más información sobre los planes del query y las estadísticas de ejecución, consulta Explicar resultados en el manual del servidor.
Puedes especificar el nivel de detalle de tu explicación pasando un nivel de verbosidad al método explain().
La siguiente tabla muestra todos los niveles de verbosidad para las explicaciones y sus casos de uso previstos:
Nivel de verbosidad | Caso de uso |
|---|---|
ALL_PLANS_EXECUTIONS | Quieres saber qué plan elegirá MongoDB para ejecutar tu query. |
EXECUTION_STATS | Tu quieres saber si tu query está funcionando bien. |
QUERY_PLANNER | Tienes un problema con tu query y quieres la mayor cantidad de información posible para diagnosticar el problema. |
En el siguiente ejemplo, se imprime la representación JSON de los planes ganadores para cualquier etapa de agregación que produzca planes de ejecución:
Document explanation = collection.aggregate( Arrays.asList( Aggregates.match(Filters.eq("categories", "Bakery")), Aggregates.group("$stars", Accumulators.sum("count", 1)) ) ).explain(ExplainVerbosity.EXECUTION_STATS); String winningPlans = explanation .getEmbedded( Arrays.asList("queryPlanner", "winningPlan", "queryPlan"), Document.class ) .toJson(JsonWriterSettings.builder().indent(true).build()); System.out.println(winningPlans);
El ejemplo produce el siguiente resultado ya que la etapa $group es la única etapa que produce un plan de ejecución:
{ "stage": "GROUP", "planNodeId": 2, "inputStage": { "stage": "COLLSCAN", "planNodeId": 1, "filter": { "categories": { "$eq": "Bakery" } }, "direction": "forward" } }
Para obtener más información sobre los temas mencionados en esta sección, consulta los siguientes recursos:
Explicar salida Entrada manual del servidor
Planes de consulta Entrada del manual del servidor
ExplainVerbosity Documentación de la API
explain() Documentación de la API
AggregateIterable Documentación de API
Ejemplo de expresión de agregación
El driver de Java proporciona desarrolladores para expresiones de acumulador para usar con $group. Debes declarar todas las demás expresiones en formato JSON o en un formato de documento compatible.
Tip
La sintaxis en cualquiera de los siguientes ejemplos definirá una expresión $arrayElemAt.
El $ delante de "categorías" le indica a MongoDB que esto es una ruta de campo, usando el campo categories del documento de entrada.
new Document("$arrayElemAt", Arrays.asList("$categories", 0))
Document.parse("{ $arrayElemAt: ['$categories', 0] }")
Como alternativa, puedes construir expresiones usando la API de Operaciones de Expresiones de Agregación. Para obtener más información, consulta Operaciones de Expresión de Agregación.
En el siguiente ejemplo, la pipeline de agregación utiliza una $project etapa y varios Projections para devolver el campo name y el campo calculado firstCategory cuyo valor es el primer elemento del campo categories.
collection.aggregate( Arrays.asList( Aggregates.project( Projections.fields( Projections.excludeId(), Projections.include("name"), Projections.computed( "firstCategory", new Document( "$arrayElemAt", Arrays.asList("$categories", 0) ) ) ) ) ) ).forEach(doc -> System.out.println(doc.toJson()));
La agregación anterior genera los siguientes resultados:
{"name": "456 Cookies Shop", "firstCategory": "Bakery"} {"name": "Sun Bakery Trattoria", "firstCategory": "Pizza"} {"name": "456 Steak Restaurant", "firstCategory": "Steak"} {"name": "Blue Bagels Grill", "firstCategory": "Bagels"} {"name": "XYZ Steak Buffet", "firstCategory": "Steak"} {"name": "Hot Bakery Cafe", "firstCategory": "Bakery"} {"name": "Green Feast Pizzeria", "firstCategory": "Pizza"} {"name": "ZZZ Pasta Buffet", "firstCategory": "Pasta"} {"name": "XYZ Coffee Bar", "firstCategory": "Coffee"} {"name": "XYZ Bagels Restaurant", "firstCategory": "Bagels"}
Para obtener más información sobre los métodos y clases mencionados en esta sección, consulte la siguiente documentación de la API: