sql >> データベース >  >> NoSQL >> MongoDB

Spring DataでMongo集計クエリを実行するにはどうすればよいですか?

    これは古いスレッドですが、このスレッドを見つけた人は誰でも、MongoRepositoryでマルチステージ/パイプライン集約(何と呼ばれるかはよくわかりません)を安全に実行できるようになることを願っています。mongoリポジトリで集約の手がかりと例を探すのにも苦労しているのでmongoテンプレートなし

    しかし今、私はここで述べた春のドキュメントに従って集約パイプラインを実行することができます

    私の集計は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'}
         }}
     ])
    

    MongoRepositoryで@Aggregationアノテーションに変換すると、次のようになります(後置詞を削除し、メソッドparamsに置き換えます):

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

    この回答が、mongotemplateを使用せずにmongorepositoryで集計を実行しようとするすべての人に役立つことを願っています



    1. ServiceStackエンティティIDフィールド名

    2. Redisはどのようにして高いスループットとパフォーマンスを実現しますか?

    3. Redisは認証にユーザー名を使用しますか?

    4. ApacheHBaseのMOBの新しいサポートの内部