将mongo db查询映射到spring

时间:2017-01-26 13:46:45

标签: spring mongodb

我知道这个问题在此之前已被问过一百万次了,但是找不到与我的用例匹配的任何内容。可能是由于缺乏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添加到群组中。

我将非常感谢任何人可以在这里给我的任何帮助或指示。

1 个答案:

答案 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();