当前位置: 首页 > 知识库问答 >
问题:

SpringData-Mongo-Aggregation

施驰
2023-03-14

我与MongoDB和Spring数据的聚合框架进行了相当长的一段时间的斗争,我实际上想知道我想做的事情是否真的可能。

{
  "_id": ObjectId("564520fad4c64dd36fb1f0a4"),
  "_class": "com.sample.Purchase",
  "created": new Date(1447371002645),
  "productId": NumberLong(12),
  "clientId": "c1",
  "price": NumberLong(20)
}
List<ClientStatsEntry> entries;

public class ClientStatsEntry  {
   private String clientId;
   private Date firstSeen;
   private Date lastSeen;
   private Long totalPriceSpend;
   private long totalCount;
}
    null

我试图从这种方法开始,但我找不到如何在一个聚合pipeline中完成所有事情的方法:

Aggregation agg = newAggregation(
            match(Criteria.where("productId").is(productId)),
            group("clientId").sum("price").as("totalPriceSpend"),
            Aggregation.project("totalPriceSpend", "productId").and("productId").previousOperation());

共有1个答案

贾越
2023-03-14

我相信您正在寻找这个聚合管道(注释表示概述的步骤):

db.purchase.aggregate([
    /* 1. Filter collection by productId (match) */
    {
        "$match": {
            "productId": productId
        }
    },
    /* 2. Split all remaining elements by clientIds (groupBy) */
    {
        "$group": {
            "_id": "$clientId",
            "firstSeen": { "$min": "$createdDate"}, // 3. a) Retrieve the created date of the first entry
            "lastSeen": { "$max": "$createdDate"}, // 3. b) Retrieve the created date of the last entry
            /* 4. Sum up all prices and store in "totalPrice" */
            "totalPriceSpend": {
                "$sum": "$price"
            },
            /* 5. Count all purchases and store it in "totalCount" */
            "totalCount": {
                "$sum": 1
            }
        }
    }
])

Spring Data MongoDB聚合等效项如下:

Aggregation agg = Aggregation.newAggregation( 
    match(Criteria.where("productId").is(productId)),
    group("clientId")
        .min("createdDate").as("firstSeen")
        .max("createdDate").as("lastSeen")
        .sum("price").as("totalPriceSpend")
        .count().as("totalCount"),
    project("firstSeen", "lastSeen", "totalPriceSpend", "totalCount")
        .and("clientId").previousOperation()
); 
AggregationResults<ClientStatsEntry> result = 
    mongoTemplate.aggregate(agg, ClientStatsEntry.class);
List<ClientStatsEntry> clientStatsList = result.getMappedResults();
 类似资料:
  • 问题背景 之前做springboot项目在操作数据库方面一直在使用的是Mybatis,最近在查阅资料的时候接触到了SpringData JPA与SpringData JDBC,想问一下大佬们,这三个框架如何选型

  • 我是Neo4j和SDN的新手。我试图使用@index(unique=true)为我的实体创建主键。它创建唯一的节点,但如果使用索引的相同属性值,它将替换其他属性。如: 但是,我想抛出一个关于主键冲突/重复节点的异常。 有什么方法可以达到同样的效果吗?

  • 使用spring data for mongodb,如何指定存储库方法的返回类型以包含文档中的特定属性?前任: 存储库: 上面的findAllNames按预期工作,只从文档中获取name属性。然而,spring数据返回的对象是Foo对象的字符串表示,该对象具有id和name属性,值和其余属性为null。我需要获取列表,而不是Foo对象

  • 目前,我有个问题。我可以在mongodb中使用聚合函数查询相应的数据,但是在使用springdatamongodb后,我发现lookup不能使用变量将string转换为objectid,那么该如何编写这个聚合函数呢 如何在spring data mogodb中将其写成mongodb表达式

  • 我对SpringData和JPA有问题。当我向HomeRepository接口添加方法时,我得到一个错误。我使用的是JPararePository接口,在pom.xml文件中有一个MySQL数据库集。这些只是我对spring的开始,所以我需要一些了解spring的人的帮助。下面是我的代码和日志: 主页库: 用户存储库: 日志:

  • 我需要使用JParePository执行以下操作: 我目前这样做: