# Ejemplo $match, $group combinado

## ·$match con $group contando los documentos en la colección

Filtrar los articulos con marca.idmarca=9 los agrupa por activo y cuenta la cantidad

| Orden                                                                                                                  | Salida                                                                                                                                 |
| ---------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| db.articulo.aggregate(\[ {"$match" :{"marca.idmarca":9}}, {"$group":{\_id:{"activo":"$activo"},cantidad:{$sum",1}}} ]) | { "\_id" : { "activo" : "si" }, "cantidad" : 95}                                     { "\_id" : { "activo" : "no" }, "cantidadl" : 2 } |

* **aggregateFromDocument()**
* Definir el filtro mediante $match donde se filtraran los articulos con marca.idmarca=9
* Agrupar por el campo activo $group
* Contar el numero de documentos cantidad mediante $sum,1

```java
 List<Document> documentList = Arrays.asList(
   new Document("$match",
   new Document("marca.idmarca", 9)),
   new Document("$group",
   new Document("_id", "$" + "activo").append("cantidad", new Document("$sum", 1))));
List<JmoordbResult> list = articuloRepository.aggregateFromDocument(documentList);

if (list == null || list.isEmpty()) {
System.out.println("No hay articulos con esa condicion");
} else {

list.forEach((a) -> {
System.out.println("_id " + a.get("_id") + " Cantidad: " + a.get("cantidad"));
});
```

## Salida

## ![](https://1490144122-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6bBVlJX-GjApa1%2F-Lc1WhtDA-TTmZ6My9OJ%2F-Lc1WvR56qvTSpTkfqj7%2Frdfd.png?generation=1554820616034326\&alt=media)

## ·$match con $group sumando el costo

* Filtrar los articulos con marca.idmarca=9 los agrupa por activo y suma el $costo

| Orden                                                                                                                            | Salida                                                                                                                                 |
| -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| db.articulo.aggregate(\[ {"$match" :{"marca.idmarca":9}}, {"$group":{\_id:{"activo":"$activo"},costo\_total:{$sum:"$costo"}}} ]) | { "\_id" : { "activo" : "si" }, "costo\_total" : 13844.6 }                      { "\_id" : { "activo" : "no" }, "costo\_total" : 370 } |

* **aggregateFromDocument()**

```java
 List<Document> documentList = Arrays.asList(
                    new Document("$match",
                            new Document("marca.idmarca", 9)),
                    new Document("$group",
                            new Document("_id", "$" + "activo").append("costototal", new Document("$sum", "$costo"))));
            List<JmoordbResult> list = articuloRepository.aggregateFromDocument(documentList);

            if (list == null || list.isEmpty()) {
                System.out.println("No hay articulos con esa condicion");
            } else {

                list.forEach((a) -> {
                    System.out.println("_id " + a.get("_id") + " Costo Total: " + a.get("costototal"));
                });

            }
```

![](https://1490144122-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6bBVlJX-GjApa1%2F-Lc1WhtDA-TTmZ6My9OJ%2F-Lc1WvRT6mT9YxoCUvLU%2Fsi.png?generation=1554820620556674\&alt=media)

* **aggregateFromBuilder()**
* Filtra por marca.idmarca = 9
* Agrupa por el campo activo
* Suma el campo cantidad
* calcula el promedio del costo
* Lo guarda en una coleccion llamada view

```java
 List<Bson> builder = Arrays.asList(match(eq("marca.idmarca", 9)),
                    group("$activo", sum("total", "$cantidad"),
                            avg("promedio", "$costo")),
                    out("view"));
            List<JmoordbResult> list = articuloRepository.aggregateFromBuilder(builder);

            if (list == null || list.isEmpty()) {
                System.out.println("No hay articulos con esa condicion");
            } else {

                list.forEach((a) -> {
                    System.out.println("_id " + a.get("_id") + " Total: " + a.get("total") + " Costo:" + a.get("promedio"));
                });

            }
```

Salida

![](https://1490144122-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6bBVlJX-GjApa1%2F-Lc1WhtDA-TTmZ6My9OJ%2F-Lc1WvRV97PtzlLLTfM1%2Ftotal.png?generation=1554820620315811\&alt=media)

## aggregateFromBuilder() /Suma la cantidad agrupado por activo

* Agruparlo por activo y totalizar el valor del campo cantidad de la colección

```java
 List<Bson> builder = Arrays.asList(
                    group("$activo", sum("total", "$cantidad"))

                    );
            List<JmoordbResult> list = articuloRepository.aggregateFromBuilder(builder);

            if (list == null || list.isEmpty()) {
                System.out.println("No hay articulos con esa condicion");
            } else {

                list.forEach((a) -> {
                    System.out.println("_id " + a.get("_id") + " Total: " + a.get("total") );
                });

            }
```

![](https://1490144122-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6bBVlJX-GjApa1%2F-Lc1WhtDA-TTmZ6My9OJ%2F-Lc1WvRXKPkjJ_p1pR7R%2Fcad.png?generation=1554820610932061\&alt=media)

## .aggregateFromBuilder()/Filtra, agrupa,suma y calcula el promedio

* Filtrar por activo = si
* agruparlo por marca.idmarca que es un embebido
* sumar la cantidad en la variable total
* calcular el promedio del costo en la variable promedio

```java
  List<Bson> builder = Arrays.asList(match(eq("activo", "si")),
                    group("$marca.idmarca", sum("total", "$cantidad"),
                            avg("promedio", "$costo")),
                    sort(orderBy(descending("_id")))
                   );
            List<JmoordbResult> list = articuloRepository.aggregateFromBuilder(builder);

            if (list == null || list.isEmpty()) {
                System.out.println("No hay articulos con esa condicion");
            } else {

                list.forEach((a) -> {
                    System.out.println("_id " + a.get("_id") + "Total: " + a.get("total") + " Costo:" + a.get("promedio"));
                });

            }
```

![](https://1490144122-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lc1Wg6bBVlJX-GjApa1%2F-Lc1WhtDA-TTmZ6My9OJ%2F-Lc1WvRZJK0ASHsMNzan%2Fder.png?generation=1554820610952805\&alt=media)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://avbravo-2.gitbook.io/jmoordb/capitulo-7-aggregation/capitulo-6-aggregation/ejemplo-match-group-combinado.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
