Весна Монго агрегация возвращает пустой список - PullRequest
1 голос
/ 21 июня 2019

У меня 160 000 данных в моей коллекции, и я должен показать некоторые метрики об этих данных в зависимости от поля. Поэтому я думаю, что могу сгруппировать эти данные в соответствии с моим полем «домен» и получить суммированные данные из базы данных.

Я создал собственный репозиторий и модель для сгруппированных данных и запустил приведенный ниже код, но результат всегда пуст, однако, если я использую зарегистрированный конвейер на robo3t, я получаю то, что хочу.
Любая помощь приветствуется.

//customRepository
@Service
public class EventRecordRepositoryCustomImpl implements EventRecordRepositoryCustom {

    private final MongoTemplate mongo;

    @Autowired
    public EventRecordRepositoryCustomImpl(MongoTemplate mongo) {
        this.mongo = mongo;
    }

    @Override
    public List<EventRecordCounts> query(String[] statuses) {
        //MatchOperation match = Aggregation.match(new Criteria("status").not().in(Arrays.asList(statuses)));
        GroupOperation group = Aggregation.group("domain").sum("relatedRecordCount").as("totalRelatedEventCount").count().as("totalMainEventCount");
        AggregationOptions aggregationOptions = Aggregation.newAggregationOptions().explain(true).build();

        Aggregation aggregation = Aggregation.newAggregation( group).withOptions(aggregationOptions);

        AggregationResults<EventRecordCounts> result = mongo.aggregate(aggregation, mongo.getCollectionName(EventRecord.class), EventRecordCounts.class);
        return result.getMappedResults();
    }
}
//my collection: all getter and setters are provided
@Document(collection = "event_record")
public class EventRecord extends BaseModel {

    private ObjectId collectorId;

    @Indexed
    private String recordNumber;

    @Indexed
    private String status;

    private Long createdAt;

    @Indexed
    private Long updatedAt;

    private Long finishedAt;

    private String responsible;

    private String responsibleUserName;

    private String group;

    private String type;

    private String importance;

    private String summary;

    private Integer relatedRecordCount;

    @Indexed
    private String domain;
      }
//Expected output model: all getter and setters are provided
public class EventRecordCounts {

    @Field("_id")
    private String _id;

    private String domain;

    private long openMainEventCount;

    private long openRelatedEventCount;

    private long totalMainEventCount;

    private long totalRelatedEventCount;
}

переключил регистратор на уровень отладки, и он только регистрирует ниже.

2019-06-21 17:46:09,182 DEBUG o.s.data.mongodb.core.MongoTemplate - Executing aggregation: { "aggregate" : "event_record" , "pipeline" : [ { "$group" : { "_id" : "$domain" , "totalRelatedEventCount" : { "$sum" : "$relatedRecordCount"} , "totalMainEventCount" : { "$sum" : 1}}}] , "explain" : true}

Если я использую конвейер в robo3t, результат также ожидается

1 Ответ

1 голос
/ 24 июня 2019

После небольшого расследования с отладкой я нашел глупое решение.Я получаю свои данные в AggregationResults.rawResults с ключом "firstBatch" и returnPotentiallyMappedResults методом в MongoTemplate классе, пытаясь получить их с помощью ключа "result".Итак, я написал CustomMongoTemplate и оверрайд returnPotentiallyMappedResults

...