MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да направя заявка за агрегиране на Mongo в Spring Data?

Въпреки че това е стара нишка, но се надявам, че всеки, който е намерил тази нишка, вече може безопасно да прави многоетапно/тръбопроводно агрегиране (не съм съвсем сигурен как се нарича) в MongoRepository. Тъй като аз също се мъча да търся улика и пример за агрегиране в хранилището на mongo без шаблон за монго .

Но сега мога да направя тръбопровода за агрегация, както е посочено тук в Spring doc

Моето агрегиране изглежда така в 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'}
     }}
 ])

Докато го трансформирам в @Aggregation анотацията в MongoRepository, става така по-долу (премахвам апострефа и също така замествам с параметри на метода):

@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);

Моят документ изглежда така:

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

И класът SumPrice за задържане на прогнозите:

@Data
public class SumPrice {
  private BigDecimal totalPrice;
}

Надявам се, че този отговор може да помогне на всеки, който се опита да направи агрегиране в mongorepository, без да използва mongotemplate .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Най-бързият MongoDB на Azure!

  2. Как MongoDB подрежда своите документи в една колекция?

  3. Синхронизиране на MongoDB чрез ssh

  4. Как да оптимизирате производителността на MongoDB

  5. Как да направя дата на заявка в mongodb с помощта на pymongo?