我一直在与MongoDB和Spring Data的聚合框架搏斗,实际上我想知道我想做的事情是否可能。
我有以下Mongo文档:
{
"_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;
}
基本上步骤如下:
- 按productId进行过滤(匹配)集合
- 按clientIds分组剩余所有元素(groupBy)
- 检索第一条和最后一条条目的创建日期
- 将所有价格加起来并存储在"totalPrice"中
- 计算所有购买数量并将其存储在"totalCount"中
我尝试使用这种方法开始,但是我找不到一种方法可以在一个聚合管道中完成所有操作:
Aggregation agg = newAggregation(
match(Criteria.where("productId").is(productId)),
group("clientId").sum("price").as("totalPriceSpend"),
Aggregation.project("totalPriceSpend", "productId").and("productId").previousOperation());