Conversation
There was a problem hiding this comment.
Pull request overview
This PR adds MongoDB support for single-document update operations that return the matched document (i.e., findOneAndUpdate) via a new @MongoUpdateReturningQuery annotation, along with runtime execution and corresponding docs/tests.
Changes:
- Introduces
@MongoUpdateReturningQueryand wires a new MongoUPDATE_RETURNINGexecution path based onfindOneAndUpdate. - Adds runtime query/option models (
MongoFindOneAndUpdate, prepared/stored query APIs) and implements execution inDefaultMongoRepositoryOperations.execute. - Updates documentation and adds processor/runtime tests covering before/after return document, DTO/scalar projection, and sort selection.
Reviewed changes
Copilot reviewed 15 out of 15 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
src/main/docs/guide/mongo/mongoRepositories/mongoCustomQueries.adoc |
Documents @MongoUpdateReturningQuery, returnDocument behavior, and usage constraints. |
data-mongodb/src/test/java/io/micronaut/data/document/mongodb/repositories/MongoPersonRepository.java |
Adds update-returning repository methods (entity/DTO/scalar, sort, options param). |
data-mongodb/src/test/java/io/micronaut/data/document/mongodb/repositories/MongoBookRepository.java |
Adds book examples for update-returning and AFTER behavior. |
data-mongodb/src/test/groovy/io/micronaut/data/document/mongodb/MongoDocumentRepositorySpec.groovy |
Adds integration tests for update-returning behavior and projections. |
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/options/MongoOptionsUtils.java |
Adds FindOneAndUpdateOptions builder for update-returning operations. |
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/MongoStoredQuery.java |
Adds stored-query API to retrieve update-returning execution data. |
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/MongoPreparedQuery.java |
Adds prepared-query API to retrieve update-returning execution data. |
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/MongoFindOneAndUpdate.java |
New value object representing findOneAndUpdate inputs (filter/update/options). |
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/DefaultMongoStoredQuery.java |
Builds MongoFindOneAndUpdate from stored query + invocation context; merges options/projection/sort/collation. |
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/DefaultMongoRepositoryOperations.java |
Implements execute() for UPDATE_RETURNING using collection.findOneAndUpdate. |
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/DefaultMongoPreparedQuery.java |
Exposes update-returning data from stored query on prepared query. |
data-mongodb/src/main/java/io/micronaut/data/mongodb/annotation/MongoUpdateReturningQuery.java |
New annotation defining update JSON, filter, projection, sort, collation, and returnDocument. |
data-document-processor/src/test/groovy/io/micronaut/data/document/processor/BuildMongoQuerySpec.groovy |
Adds compile-time processor tests validating return-type constraints and metadata storage (e.g., sort). |
data-document-processor/src/main/java/io/micronaut/data/document/processor/matchers/MongoRawQueryMethodMatcher.java |
Adds processor matching for @MongoUpdateReturningQuery and validates return-type constraints. |
data-document-model/src/main/java/io/micronaut/data/document/mongo/MongoAnnotations.java |
Adds constant for MongoUpdateReturningQuery. |
Comments suppressed due to low confidence (1)
data-document-processor/src/main/java/io/micronaut/data/document/processor/matchers/MongoRawQueryMethodMatcher.java:135
- Update-returning repository methods can declare a
FindOneAndUpdateOptionsparameter (see tests), but the matcher never assigns a parameter role for it. WithoutMongoAnnotations.UPDATE_OPTIONS_ROLEbeing set for that parameter,DefaultMongoStoredQuerywon’t be able to locate it (getParameterInRole(MongoRoles.UPDATE_OPTIONS_ROLE)), and the runtimeFindOneAndUpdateOptionsargument will be ignored.
Tangible fix: when operationType == UPDATE_RETURNING, detect a parameter of type com.mongodb.client.model.FindOneAndUpdateOptions and add it as MongoAnnotations.UPDATE_OPTIONS_ROLE (similar to how MongoExecutorQueryMethodMatcher handles UpdateOptions).
ParameterElement[] parameters = matchContext.getParameters();
ParameterElement entityParameter;
ParameterElement entitiesParameter;
if (parameters.length > 1) {
entityParameter = null;
entitiesParameter = null;
} else {
entityParameter = Arrays.stream(parameters).filter(p -> TypeUtils.isEntity(p.getGenericType())).findFirst().orElse(null);
entitiesParameter = Arrays.stream(parameters).filter(p -> TypeUtils.isIterableOfEntity(p.getGenericType())).findFirst().orElse(null);
}
.../src/main/java/io/micronaut/data/document/processor/matchers/MongoRawQueryMethodMatcher.java
Outdated
Show resolved
Hide resolved
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/options/MongoOptionsUtils.java
Outdated
Show resolved
Hide resolved
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/DefaultMongoStoredQuery.java
Outdated
Show resolved
Hide resolved
…ver runtime options (#3778) * Initial plan * Rename misleading test to clarify annotation returnDocument precedence over options Co-authored-by: radovanradic <10271067+radovanradic@users.noreply.github.com> Agent-Logs-Url: https://github.com/micronaut-projects/micronaut-data/sessions/479c10cc-d017-4c2d-bdc5-7a89803859e9 --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: radovanradic <10271067+radovanradic@users.noreply.github.com>
src/main/docs/guide/mongo/mongoRepositories/mongoCustomQueries.adoc
Outdated
Show resolved
Hide resolved
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/DefaultMongoStoredQuery.java
Outdated
Show resolved
Hide resolved
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
...odb/src/main/java/io/micronaut/data/mongodb/operations/DefaultMongoRepositoryOperations.java
Show resolved
Hide resolved
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/DefaultMongoStoredQuery.java
Show resolved
Hide resolved
.../src/main/java/io/micronaut/data/document/processor/matchers/MongoRawQueryMethodMatcher.java
Show resolved
Hide resolved
data-mongodb/src/main/java/io/micronaut/data/mongodb/annotation/MongoUpdateReturningQuery.java
Outdated
Show resolved
Hide resolved
...odb/src/main/java/io/micronaut/data/mongodb/operations/DefaultMongoRepositoryOperations.java
Show resolved
Hide resolved
...odb/src/main/java/io/micronaut/data/mongodb/operations/DefaultMongoRepositoryOperations.java
Outdated
Show resolved
Hide resolved
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/DefaultMongoStoredQuery.java
Show resolved
Hide resolved
...odb/src/main/java/io/micronaut/data/mongodb/operations/DefaultMongoRepositoryOperations.java
Show resolved
Hide resolved
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/MongoStoredQuery.java
Show resolved
Hide resolved
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/MongoStoredQuery.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 19 out of 19 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (1)
data-mongodb/src/main/java/io/micronaut/data/mongodb/operations/MongoRoles.java:23
- Typo in Javadoc: “contansts” should be “constants”.
/**
* Mongo parameter roles contansts.
*
src/main/docs/guide/mongo/mongoRepositories/mongoCustomQueries.adoc
Outdated
Show resolved
Hide resolved
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
.../src/main/java/io/micronaut/data/document/processor/matchers/MongoRawQueryMethodMatcher.java
Show resolved
Hide resolved
…, Publisher) Agent-Logs-Url: https://github.com/micronaut-projects/micronaut-data/sessions/ac6a4d7a-23ae-416c-aa6e-67f965aa8bad Co-authored-by: radovanradic <10271067+radovanradic@users.noreply.github.com>
|
Just as a heads up, I was blocked by some firewall rules while working on your feedback. Expand below for details. Warning Firewall rules blocked me from connecting to one or more addresses (expand for details)I tried to connect to the following addresses, but was blocked by firewall rules:
If you need me to access, download, or install something from one of these locations, you can either:
|
|




Requested in #2023