# 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)
