MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como fazer uma consulta de agregação do Mongo no Spring Data?


Embora este seja um tópico antigo, mas espero que quem encontrou este tópico agora possa com segurança fazer agregação de vários estágios/pipeline (não tenho certeza do que é chamado) no MongoRepository. sem modelo mongo .

Mas agora, posso fazer o pipeline de agregação conforme o documento da primavera dito aqui

Minha agregação se parece com isso no 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'}
     }}
 ])

Enquanto eu o transformo em anotação @Aggregation no MongoRepository fica assim abaixo (estou removendo o apóstrofo e também substituindo por 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);

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

E a classe SumPrice para manter as projeções:
@Data
public class SumPrice {
  private BigDecimal totalPrice;
}

Espero que esta resposta possa ajudar quem tentar fazer agregação no mongorepository sem usar mongotemplate .