spring-data-mongodb icon indicating copy to clipboard operation
spring-data-mongodb copied to clipboard

Sort without grouped fields

Open 1053531172 opened this issue 3 years ago • 2 comments

    db.rep_report_param_label.aggregate([{
        "$match": {}
    }, {
        "$group": {
            "_id": {
                "_id:null": "$_id:null",
                "label_name": "$label_name"
            }
        }
    }, {
        "$project": {
            "label_name": "$_id.label_name",
            "_id": 0
        }
    }, {
        "$sort": {
            "serial_number": - 1,
            "label_name": - 1
        }
    }, {
        "$skip": 290
    }, {
        "$limit": 10
    }]) 

this is ok in mongodb. but i use in spring data mongodb v3.0.0 like this,

    GroupOperation groupOperation = Aggregation.group("_id:null", "label_name");
    aggregationOperations.add(groupOperation);
    countAggregationOperations.add(groupOperation);

    ProjectionOperation projectionOperation = Aggregation.project("label_name").andExclude("_id");
    aggregationOperations.add(projectionOperation);
    countAggregationOperations.add(projectionOperation);

    Sort sort = Sort.by(Sort.Direction.DESC, "serial_number");
    SortOperation sortOperation = new SortOperation(sort).and(Sort.Direction.DESC, "label_name");
    aggregationOperations.add(sortOperation);

it was wrong

    java.lang.IllegalArgumentException: Invalid reference 'serial_number'!
        at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:114) ~[spring-data-mongodb-3.0.0.RELEASE.jar:3.0.0.RELEASE]
        at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:86) ~[spring-data-mongodb-3.0.0.RELEASE.jar:3.0.0.RELEASE]
        at org.springframework.data.mongodb.core.aggregation.InheritingExposedFieldsAggregationOperationContext.resolveExposedField(InheritingExposedFieldsAggregationOperationContext.java:62) ~[spring-data-mongodb-3.0.0.RELEASE.jar:3.0.0.RELEASE]
        at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:109) ~[spring-data-mongodb-3.0.0.RELEASE.jar:3.0.0.RELEASE]
        at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:86) ~[spring-data-mongodb-3.0.0.RELEASE.jar:3.0.0.RELEASE]
        at org.springframework.data.mongodb.core.aggregation.SortOperation.toDocument(SortOperation.java:73) ~[spring-data-mongodb-3.0.0.RELEASE.jar:3.0.0.RELEASE]
        at org.springframework.data.mongodb.core.aggregation.AggregationOperation.toPipelineStages(AggregationOperation.java:55) ~[spring-data-mongodb-3.0.0.RELEASE.jar:3.0.0.RELEASE]
        at org.springframework.data.mongodb.core.aggregation.AggregationOperationRenderer.toDocument(AggregationOperationRenderer.java:56) ~[spring-data-mongodb-3.0.0.RELEASE.jar:3.0.0.RELEASE]
        at org.springframework.data.mongodb.core.aggregation.Aggregation.toPipeline(Aggregation.java:721) ~[spring-data-mongodb-3.0.0.RELEASE.jar:3.0.0.RELEASE]
        at org.springframework.data.mongodb.core.AggregationUtil.createPipeline(AggregationUtil.java:95) ~[spring-data-mongodb-3.0.0.RELEASE.jar:3.0.0.RELEASE]
        at org.springframework.data.mongodb.core.MongoTemplate.doAggregate(MongoTemplate.java:2118) ~[spring-data-mongodb-3.0.0.RELEASE.jar:3.0.0.RELEASE]
        at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:2093) ~[spring-data-mongodb-3.0.0.RELEASE.jar:3.0.0.RELEASE]
        at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1992) ~[spring-data-mongodb-3.0.0.RELEASE.jar:3.0.0.RELEASE]
        at 

1053531172 avatar Dec 21 '21 08:12 1053531172

$sort will only consider fields that are actually part of the previous stage. In this case the $project stage does not include serial_number, which causes the error you see. Which version are you using? We relaxed the field exposure checks (see #3542).

christophstrobl avatar Dec 21 '21 10:12 christophstrobl

version is 3.0.0.RELEASE

1053531172 avatar Dec 21 '21 10:12 1053531172