javamongodbaggregation-framework

mongoDB Query Unwind issue


I have a mongoDB Query that uses aggregation. I am applying projection and then unwind.

 ProjectionOperation projectionPreUnwind = Aggregation.project(Fields.from(Fields.field("result.detections.reference.control", "result.detections.reference.control")));

        UnwindOperation unwindOpn = Aggregation.unwind("result.detections");

        Aggregation aggregation = Aggregation.newAggregation(projectionPreUnwind, unwindOpn);

        LOGGER.info(" aggregation {}", aggregation);

        AggregationResults<String> detectionsDataAggr = mongoTemplate.aggregate(aggregation, CASES_COLLECTION, String.class);

The code result in Error

2024-10-23 16:48:00.097  INFO B33543D --- [nio-8082-exec-9] .c.c.s.d.r.c.i.MyRepoImpl : ENTERING   aggregation [!!!org.springframework.data.mongodb.core.aggregation.Aggregation@3fee8ffe=>java.lang.IllegalArgumentException:Invalid reference 'result.detections'!!!!]

2024-10-23 16:48:03.158 ERROR B33543D --- [nio-8082-exec-9] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Invalid reference 'result.detections'!] with root cause java.lang.IllegalArgumentException: Invalid reference 'result.detections'! at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:114) at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:77) at org.springframework.data.mongodb.core.aggregation.UnwindOperation.toDocument(UnwindOperation.java:95)

Sample JSON File

{
"result": {
    "aiModel": "",
    "detections": [
        {
            "aiStatus": "PASS",
            "reference": {
                "attribute": "TEST",
                "control": "C Test"
            }
        },
        {
            "aiStatus": "FAIL",
            "reference": {
                "attribute": "TES22T",
                "control": "C Test"
            }
        }
    ]
}

}


Solution

  • I think the problem is in ProjectOperation

    You are trying with same key and try to access value with same key and then you are trying to unwind that but its throw error because in unwind operation you can get proper reference of a key so review below code and give simple key in projection.

    I think you can try projection like this

    ProjectionOperation projectionOperation = Aggregation.project().and("YOUR_ACTUAL_FIELD_WHICH_ONLY_YOU_WANT").as("KEY_WHICH_YOU_DEFINE_TO_YOUR_VALUE");
    

    Then you should try unwind operation

    UnwindOperation unwindOpn = Aggregation.unwind("YOUR_PROJECTION_OUTPUT_KEY");
    

    I am also attaching the correct mongo query :

    https://mongoplayground.net/p/IPPFG-gr3uY

    Hope this will work for you.