sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo hacer una consulta de agregación de Mongo en Spring Data?

Aunque este es un hilo antiguo, espero que quien haya encontrado este hilo ahora pueda realizar de forma segura la agregación de múltiples etapas/tuberías (no estoy muy seguro de cómo se llama) en MongoRepository. Como también estoy luchando buscando una pista y un ejemplo de agregación en el repositorio de mongo sin plantilla mongo .

Pero ahora, puedo hacer la canalización de agregación según el documento de primavera que se dice aquí

Mi agregación se ve así en mongoshell:

db.getCollection('SalesPo').aggregate([
    {$project: {
        month: {$month: '$poDate'},
        year: {$year: '$poDate'},
        amount: 1,
        poDate: 1
     }},
      {$match: {$and : [{year:2020} , {month:7}] 
     }}
      ,
      {$group: { 
          '_id': {
            month: {$month: '$poDate'},
            year: {$year: '$poDate'} 
          },
          totalPrice: {$sum: {$toDecimal:'$amount'}},
          }
      },
    {$project: {
        _id: 0,
        totalPrice: {$toString: '$totalPrice'}
     }}
 ])

Mientras lo transformo en una anotación @Aggregation en MongoRepository, se vuelve así a continuación (elimino el apóstrofo y también lo reemplazo con parámetros de método):

@Repository
public interface SalesPoRepository extends MongoRepository<SalesPo, String> {

@Aggregation(pipeline = {"{$project: {\n" +
        "        month: {$month: $poDate},\n" +
        "        year: {$year: $poDate},\n" +
        "        amount: 1,\n" +
        "        poDate: 1\n" +
        "     }}"
        ,"{$match: {$and : [{year:?0} , {month:?1}] \n" +
        "     }}"
        ,"{$group: { \n" +
        "          '_id': {\n" +
        "            month: {$month: $poDate},\n" +
        "            year: {$year: $poDate} \n" +
        "          },\n" +
        "          totalPrice: {$sum: {$toDecimal:$amount}},\n" +
        "          }\n" +
        "      }"
    ,"{$project: {\n" +
        "        _id: 0,\n" +
        "        totalPrice: {$toString: $totalPrice}\n" +
        "     }}"})
    AggregationResults<SumPrice> sumPriceThisYearMonth(Integer year, Integer month);

Mi documento se ve así:

@Document(collection = "SalesPo")
@Data
public class SalesPo {
  @Id
  private String id;
  @JsonSerialize(using = LocalDateSerializer.class)
  private LocalDate poDate;
  private BigDecimal amount;
}

Y la clase SumPrice para mantener las proyecciones:

@Data
public class SumPrice {
  private BigDecimal totalPrice;
}

Espero que esta respuesta pueda ayudar a cualquiera que intente agregar en mongorepository sin usar mongotemplate .