0

I want to get by the fastest speed of each car/carId, I have problem in getting/retaining all field when using aggregation in spring mongo . I have check some relatvent in stackoverflow like

mongo aggregation:- push all fields using Spring this was pushing to a new array using push

How to group by max value and get full entities from MongoDB in Spring Boot? the group by multiple field using returning many doc (instead of unique carId)

My race Collection was as below:
 
Race{raceId='64c2350402708c36b821e5bc', raceNum=430, trackNum='2', carUser='null', carId='ZZ9992', raceStart=null, raceEnd=null, raceResulttime=2.262371, raceDatetime=Thu Jul 27 17:12:36 HKT 2023, venue='HK', rank='2', isDnf=false, raceSpeed=0.0}, 
    
Race{raceId='64c2355f02708c36b821e5bf', raceNum=430, trackNum='2', carUser='null', carId='ZZ9992', raceStart=null, raceEnd=null, raceResulttime=2.262371, raceDatetime=Thu Jul 27 17:14:07 HKT 2023, venue='HK', rank='2', isDnf=false, raceSpeed=0.0}, 
    
Race{raceId='64c2357002708c36b821e5c2', raceNum=431, trackNum='2', carUser='null', carId='ZZ9992', raceStart=null, raceEnd=null, raceResulttime=2.262371, raceDatetime=Thu Jul 27 17:14:24 HKT 2023, venue='HK', rank='2', isDnf=false, raceSpeed=0.0}, 
    
Race{raceId='64c2357e02708c36b821e5c5', raceNum=432, trackNum='2', carUser='null', carId='ZZ9992', raceStart=null, raceEnd=null, raceResulttime=2.262371, raceDatetime=Thu Jul 27 17:14:38 HKT 2023, venue='HK', rank='2', isDnf=false, raceSpeed=0.0}, 
    
Race{raceId='64c2358d02708c36b821e5c8', raceNum=433, trackNum='2', carUser='null', carId='ZZ9992', raceStart=null, raceEnd=null, raceResulttime=2.262371, raceDatetime=Thu Jul 27 17:14:53 HKT 2023, venue='HK', rank='2', isDnf=false, raceSpeed=0.0}, 
    
Race{raceId='64c23282bc05ab7f8acd7c2a', raceNum=421, trackNum='1', carUser='null', carId='ZZ9991', raceStart=null, raceEnd=null, raceResulttime=4.298986, raceDatetime=Thu Jul 27 17:01:54 HKT 2023, venue='HK', rank='3', isDnf=false, raceSpeed=0.8806175}, 
Race{raceId='64c23294bc05ab7f8acd7c2c', raceNum=422, trackNum='1', carUser='null', carId='ZZ9991', raceStart=null, raceEnd=null, raceResulttime=4.298986, raceDatetime=Thu Jul 27 17:02:12 HKT 2023, venue='HK', rank='3', isDnf=false, raceSpeed=0.8806175}

My aggregtation code was below:

@Override
public void groupByField() {
    // Match stage
    MatchOperation matchStage = Aggregation.match(new Criteria("raceResulttime").gt(0)
            .and("isDnf").is(false)
            .and("raceNum").gt(0)
    );
    GroupOperation groupStage = group("carId")
            .min("raceResulttime").as("raceResulttime");
    SortOperation sortStage = Aggregation.sort(Sort.Direction.ASC, "raceResulttime");
    ProjectionOperation projectionOperation = Aggregation.project("raceResulttime","rank","raceSpeed","raceNum").and("carId").previousOperation();
    // Aggregation
    Aggregation aggregation = newAggregation(matchStage, groupStage, sortStage,projectionOperation);
    AggregationResults<Race> resultss = mongoTemplate.aggregate(aggregation, "race", Race.class);
    for ( Race result : resultss)
        System.out.println("4 - resultss - "+ result);
    System.out.println("5" + resultss.getMappedResults());

and my result got was:

- resultss - Race{raceId='null', raceNum=null, trackNum='null', carUser='null', carId='ZZ9992', raceStart=null, raceEnd=null, raceResulttime=1.243837, raceDatetime=null, venue='null', rank='null', isDnf=false, raceSpeed=null}
4 - resultss - Race{raceId='null', raceNum=null, trackNum='null', carUser='null', carId='ZZ9991', raceStart=null, raceEnd=null, raceResulttime=1.391792, raceDatetime=null, venue='null', rank='null', isDnf=false, raceSpeed=null}
4 - resultss - Race{raceId='null', raceNum=null, trackNum='null', carUser='null', carId='ZZ9990', raceStart=null, raceEnd=null, raceResulttime=1.483507, raceDatetime=null, venue='null', rank='null', isDnf=false, raceSpeed=null}
4 - resultss - Race{raceId='null', raceNum=null, trackNum='null', carUser='null', carId='ZZ9995', raceStart=null, raceEnd=null, raceResulttime=1.493411, raceDatetime=null, venue='null', rank='null', isDnf=false, raceSpeed=null}
4 - resultss - Race{raceId='null', raceNum=null, trackNum='null', carUser='null', carId='ZZ9996', raceStart=null, raceEnd=null, raceResulttime=1.661812, raceDatetime=null, venue='null', rank='null', isDnf=false, raceSpeed=null}

i would like to have all other field (get the other field while performing the GroupOperation groupStage = group("carId") .min("raceResulttime").as("raceResulttime"); ,thanks

Man Man Yu
  • 161
  • 3
  • 13

1 Answers1

0

If you want to project every data which is shown null in above results.

You can try projection excluding only _id

AggregationOperation project = Aggregation.project().andExclude("_id");

Hope it helps.

Ajaj Ali
  • 86
  • 4