【问题标题】:Spring data mongodb - aggregation framework integrationSpring Data MongoDB - 聚合框架集成
【发布时间】:2013-03-25 20:48:57
【问题描述】:

我开始在我的应用程序中使用MongoDB 数据库,并为数据访问选择了 Spring Data for MongoDB。

我浏览了 API 参考和文档,我可以看到有 map-reduce 集成,但是聚合框架呢?我看到它支持分组操作,这说明它支持$group操作符,由此判断:http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/,但是其他操作符呢,暂时不支持吗?

我问这个问题是因为我想知道与MongoDB Sping Data 提供了什么样的集成,所以我知道会发生什么,可以这么说。

【问题讨论】:

    标签: mongodb spring-data aggregation-framework


    【解决方案1】:

    Spring Data 1.3.0.RC1 可用,并且支持聚合框架。

    例如: shell聚合命令:

    db.eft_transactions.aggregate(
        {$match:
            {
                service:"EFT",
                source:"MARKUP",
            }
        },
        {$group:
            {
                _id:"$card_acceptor_id",
                tran_count:{$sum:1},
                amount_sum:{$sum:"$amount"}
            }
        }
    )
    

    从 java 中这样运行:

        AggregationOperation match = Aggregation.match(Criteria.where("service").is("EFT").and("source").is("MARKUP"));
        AggregationOperation group = Aggregation.group("card_acceptor").and("amount_sum").sum("amount").and("tran_count").count();
        Aggregation aggregation = newAggregation(match, group);
        AggregationResults<StoreSummary> result = this.mongoTemplate.aggregate(aggregation, "eft_transactions", StoreSummary.class);
    

    文档是here

    注意:我们最近不得不改用 1.3.0 版的 BUILD-SNAPSHOT 构建。此更改需要更改上述已更改为的 2 行:

    AggregationOperation group = Aggregation.group("card_acceptor").sum("amount").as("amount_sum").count().as("tran_count");
    Aggregation aggregation = Aggregation.newAggregation(match, group);
    

    【讨论】:

    【解决方案2】:

    Spring Data MongoOperations.group() 方法映射到 db.collection.group() MongoDB 命令,而不是 $group 聚合函数。目前 Spring Data MongoDB 中不支持聚合框架。正如您所提到的,Map reduce 是受支持的

    【讨论】:

    • 感谢您为我澄清这一点。
    • 但是,当您需要聚合框架的强大功能时,您可以先使用 mongodb Java 驱动程序。 mongoOps.getCollection("yourCollection").aggregate( ... )
    【解决方案3】:
     Aggregation aggregation = newAggregation(
            match(Criteria.where("salesyear").is(year)),
            group("brand","salesyear").sum("numberOfCars").as("total"),
            sort(Sort.Direction.ASC, previousOperation(), "brand")    
          );
    

    【讨论】:

      【解决方案4】:

      这是获取特定字段总和的方法。

      private Map<String, Long> getTotalMap(){
              /*
                  db.pDSSummaryModel.aggregate([{
                      $group: {
                          _id: null,
                          total: {
                              $sum: '$totalUniqueCustomerCount'
                          }
                      }
                  }])
               */
              Aggregation aggregations = newAggregation(
                      group("null").sum("totalUniqueUserCount").as("userTotal")
                              .sum("totalUniqueCustomerCount").as("customerTotal"),
                      project("customerTotal", "userTotal")
              );
      
              AggregationResults<DBObject> results = mongoTemplate.aggregate(aggregations, "pDSSummaryModel", DBObject.class);
              List<DBObject> fieldList = results.getMappedResults();
              Map<String, Long> map = new HashMap<>();
              if(fieldList != null && !fieldList.isEmpty()) {
                  for(DBObject db: fieldList){
                      map.put("userTotal", parseLong(db.get("userTotal").toString()));
                      map.put("customerTotal", parseLong(db.get("customerTotal").toString()));
                  }
              }
              return map;
      
          }
      

      【讨论】:

        猜你喜欢
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-20
        • 2014-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多