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;
Conectarse 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 auxiliar que contiene constructores para etapas de agregación.
En el siguiente ejemplo, la canalización 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.Utiliza una etapa $group para agrupar los documentos coincidentes por el
starscampo, acumulando un recuento de documentos para cada valor distintostarsde.
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 el ejemplo de agregación
Para ver información sobre cómo MongoDB ejecuta su operación, utilice el explain() método de la AggregateIterable clase. El explain() método devuelve planes de ejecución y estadísticas de rendimiento. Un plan de ejecución es una forma en que MongoDB puede completar una operación. El explain() método proporciona tanto el plan ganador (el plan ejecutado por MongoDB) 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 |
|---|---|
TODAS LAS EJECUCIONES DE LOS PLANES | Desea saber qué plan elegirá MongoDB para ejecutar su consulta. |
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
Documentación de la API deExplainVerbosity
Documentación de la APIexplain()
AggregateIterable Documentación de API
Ejemplo de expresión de agregación
El controlador Java proporciona constructores de expresiones de acumulador para usar con $group. Debe 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 se trata de una ruta de campo, que utiliza el categories campo 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: