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

·$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()
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"));
});
}

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

aggregateFromBuilder() /Suma la cantidad agrupado por activo
Agruparlo por activo y totalizar el valor del campo cantidad de la colección
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") );
});
}

.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
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"));
});
}

Last updated
Was this helpful?