From 3741fc73bdb0b99252518c394fd824339aaecd8d Mon Sep 17 00:00:00 2001 From: jmarkerink Date: Thu, 29 Jan 2026 00:40:38 +0100 Subject: [PATCH] fid: dot notation projection to nested object --- .../aggregation/stage/ProjectStage.java | 6 +- .../backend/AbstractAggregationTest.java | 78 +++++++++++++++++++ 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/stage/ProjectStage.java b/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/stage/ProjectStage.java index e5efea0e..e752ef48 100644 --- a/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/stage/ProjectStage.java +++ b/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/stage/ProjectStage.java @@ -75,13 +75,13 @@ Document projectDocument(Document document) { .stream() .map(value -> Expression.evaluateDocument(value, document)) .collect(Collectors.toList()); - result.put(field, resolvedProjectionValues); + Utils.changeSubdocumentValue(result, field, resolvedProjectionValues); } else if (projectionValue == null) { - result.put(field, null); + Utils.changeSubdocumentValue(result, field, null); } else { Object value = Expression.evaluateDocument(projectionValue, document); if (!(value instanceof Missing)) { - result.put(field, value); + Utils.changeSubdocumentValue(result, field, value); } } } diff --git a/test-common/src/main/java/de/bwaldvogel/mongo/backend/AbstractAggregationTest.java b/test-common/src/main/java/de/bwaldvogel/mongo/backend/AbstractAggregationTest.java index ab6f9e5a..8a00ae77 100644 --- a/test-common/src/main/java/de/bwaldvogel/mongo/backend/AbstractAggregationTest.java +++ b/test-common/src/main/java/de/bwaldvogel/mongo/backend/AbstractAggregationTest.java @@ -2714,6 +2714,84 @@ void testAggregateWithRedact() { .containsOnly(json("_id: 1")); } + @Test + void dotNotationProjection() { + collection.insertOne(json(""" + _id: 1, + companyName: 'Walt Disney', + buildingNumber: 500, + streetName: 'South Buena Vista Street', + city: 'Burbank', + state: 'California', + zipCode: 91502 + """)); + + assertThat(collection.aggregate(jsonList(""" + $project: { + Name: "$companyName", + "Address.City": "$city", + "Address.ZipCode": "$zipCode", + "Address.StreetName": "$streetName", + "Address.BuildingNumber": "$buildingNumber", + } + """))) + .containsExactly(json(""" + _id: 1, + Name: 'Walt Disney', + Address: { + City: 'Burbank', + ZipCode: 91502, + StreetName: 'South Buena Vista Street', + BuildingNumber: 500 + } + """)); + } + + @Test + void dotNotationProjectionDeepNesting() { + collection.insertOne(json(""" + _id: 1, + companyName: 'Acme Corp', + country: 'USA', + state: 'California', + city: 'San Francisco', + street: 'Market Street', + buildingNumber: 123, + floor: 5, + unit: 'A' + """)); + + assertThat(collection.aggregate(jsonList(""" + $project: { + Company: "$companyName", + "Location.Country": "$country", + "Location.Address.State": "$state", + "Location.Address.City": "$city", + "Location.Address.Details.Street": "$street", + "Location.Address.Details.BuildingNumber": "$buildingNumber", + "Location.Address.Details.Floor": "$floor", + "Location.Address.Details.Unit": "$unit" + } + """))) + .containsExactly(json(""" + _id: 1, + Company: 'Acme Corp', + Location: { + Country: 'USA', + Address: { + State: 'California', + City: 'San Francisco', + Details: { + Street: 'Market Street', + BuildingNumber: 123, + Floor: 5, + Unit: 'A' + } + } + } + """)); + } + // https://github.com/bwaldvogel/mongo-java-server/issues/191 @Test void testProjectWithCondition() throws Exception {