我知道这个问题在此之前已被问过一百万次了,但是找不到与我的用例匹配的任何内容。可能是由于缺乏Spring Mongo聚合框架的知识。我希望有人可以为我阐明这个问题。
Mongo shell聚合
{
"_id" : "00aa9c60-2950-439b-976e-0980da829981",
"currentEvent" : "UPSTREAM_QUEUE",
"events" : [
{
"_id" : "e746cd3f-dfe3-47b3-a1d0-3342adaf61c3",
"_class" : "no.fint.audit.plugin.mongo.MongoAuditEvent",
"corrId" : "00aa9c60-2950-439b-976e-0980da829981",
"source" : "employee",
"timestamp" : NumberLong("1484478431288"),
"event" : {
"corrId" : "00aa9c60-2950-439b-976e-0980da829981",
"action" : "GET_ALL_EMPLOYEES",
"status" : "DOWNSTREAM_QUEUE",
"time" : NumberLong("1484478431287"),
"source" : "employee",
"client" : "CACHE_SERVICE"
},
"clearData" : true
}
]
}
可生产
public List<DBObject> getAllAuditEvents(Integer page, Integer pageSize) {
List<DBObject> agg = new ArrayList();
agg.add(BasicDBObject.parse("{$group: {_id: \"$corrId\", currentEvent: {\"$last\": \"$event.status\"}, events: { $push: \"$$ROOT\"} }}"));
agg.add(BasicDBObject.parse("{$sort: {\"timestamp\": -1} }"));
agg.add(BasicDBObject.parse("{$limit: " + pageSize + "}"));
agg.add(BasicDBObject.parse("{$skip: " + (page * pageSize) + " }"));
return (List<DBObject>) mongoTemplate.getCollection("mongoAuditEvent")
.aggregate(agg).results();
}
我设法在Spring中将其翻译成以下内容:
allowDiskUse:true
但这失败了,因为我没有在任何地方指定public List<MongoAuditEventGroup> getAllAuditEvents(Integer page, Integer pageSize) {
return mongoTemplate.aggregate(
Aggregation.newAggregation(
Aggregation.group("corrId"),
Aggregation.sort(Sort.Direction.DESC, "corrId"),
Aggregation.limit(pageSize),
Aggregation.skip((long)page * pageSize)
).withOptions(newAggregationOptions().allowDiskUse(true).build()),
MongoAuditEvent.class,
MongoAuditEventGroup.class).getMappedResults();
}
选项,而且我似乎无法找到指定它的正确位置。
然后我看到有一种更优选的方式来指定聚合:
currentEvent
但我无法理解如何将emailVerified
添加到群组中。
我将非常感谢任何人可以在这里给我的任何帮助或指示。
答案 0 :(得分:1)
我要离开您的Mongo Shell查询。你可以尝试这样的事情。
import static org.springframework.data.domain.Sort.Direction.ASC;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
Aggregation agg = newAggregation(
group("corrId").last("event.status").as("currentEvent").push("$$ROOT").as("events"),
sort(ASC, "timestamp"),
skip(0L),
limit(10L)).
withOptions(newAggregationOptions().allowDiskUse(true).build());
List<MongoAuditEventGroup> results = mongoTemplate.aggregate(agg, MongoAuditEvent.class,
MongoAuditEventGroup.class).getMappedResults();