Switch update execution to an annotation based model that allows usage of both the classic update as well as the aggregation pipeline variant. Add the reactive variant of it.
Make sure to allow parameter binding for update expressions and verify method return types.
Update Javadoc and reference documentation.
See: #2107
Original Pull Request: #284
@ -155,6 +155,11 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor {
@@ -155,6 +155,11 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor {
@ -297,12 +302,4 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor {
@@ -297,12 +302,4 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor {
@ -70,7 +70,7 @@ public class MongoParameters extends Parameters<MongoParameters, MongoParameter>
@@ -70,7 +70,7 @@ public class MongoParameters extends Parameters<MongoParameters, MongoParameter>
@ -200,6 +200,15 @@ public class MongoParameters extends Parameters<MongoParameters, MongoParameter>
@@ -200,6 +200,15 @@ public class MongoParameters extends Parameters<MongoParameters, MongoParameter>
@ -280,7 +289,4 @@ public class MongoParameters extends Parameters<MongoParameters, MongoParameter>
@@ -280,7 +289,4 @@ public class MongoParameters extends Parameters<MongoParameters, MongoParameter>
@ -156,9 +156,9 @@ public class MongoParametersParameterAccessor extends ParametersParameterAccesso
@@ -156,9 +156,9 @@ public class MongoParametersParameterAccessor extends ParametersParameterAccesso
@ -66,33 +66,6 @@ public class ReactiveMongoQueryMethod extends MongoQueryMethod {
@@ -66,33 +66,6 @@ public class ReactiveMongoQueryMethod extends MongoQueryMethod {
@ -179,4 +152,36 @@ public class ReactiveMongoQueryMethod extends MongoQueryMethod {
@@ -179,4 +152,36 @@ public class ReactiveMongoQueryMethod extends MongoQueryMethod {
@ -122,30 +118,7 @@ public class ReactiveStringBasedAggregation extends AbstractReactiveMongoQuery {
@@ -122,30 +118,7 @@ public class ReactiveStringBasedAggregation extends AbstractReactiveMongoQuery {
@ -172,26 +168,7 @@ public class StringBasedAggregation extends AbstractMongoQuery {
@@ -172,26 +168,7 @@ public class StringBasedAggregation extends AbstractMongoQuery {
@ -47,8 +47,6 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
@@ -47,8 +47,6 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
privatefinalStringquery;
privatefinalStringfieldSpec;
privatefinalExpressionParserexpressionParser;
privatefinalbooleanisCountQuery;
privatefinalbooleanisExistsQuery;
privatefinalbooleanisDeleteQuery;
@ -85,7 +83,6 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
@@ -85,7 +83,6 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
Assert.notNull(expressionParser,"SpelExpressionParser must not be null!");
this.query=query;
this.expressionParser=expressionParser;
this.fieldSpec=method.getFieldSpecification();
if(method.hasAnnotatedQuery()){
@ -115,10 +112,8 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
@@ -115,10 +112,8 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
@ -129,16 +124,6 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
@@ -129,16 +124,6 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
@ -179,8 +164,4 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
@@ -179,8 +164,4 @@ public class StringBasedMongoQuery extends AbstractMongoQuery {
@ -199,6 +199,8 @@ public class MongoRepositoryFactory extends RepositoryFactorySupport {
@@ -199,6 +199,8 @@ public class MongoRepositoryFactory extends RepositoryFactorySupport {
@ -189,6 +189,8 @@ public class ReactiveMongoRepositoryFactory extends ReactiveRepositoryFactorySup
@@ -189,6 +189,8 @@ public class ReactiveMongoRepositoryFactory extends ReactiveRepositoryFactorySup
@ -375,7 +377,7 @@ public abstract class AbstractPersonRepositoryIntegrationTests {
@@ -375,7 +377,7 @@ public abstract class AbstractPersonRepositoryIntegrationTests {
@ -1440,7 +1442,8 @@ public abstract class AbstractPersonRepositoryIntegrationTests {
@@ -1440,7 +1442,8 @@ public abstract class AbstractPersonRepositoryIntegrationTests {
@ -1461,7 +1464,7 @@ public abstract class AbstractPersonRepositoryIntegrationTests {
@@ -1461,7 +1464,7 @@ public abstract class AbstractPersonRepositoryIntegrationTests {
@ -1474,35 +1477,58 @@ public abstract class AbstractPersonRepositoryIntegrationTests {
@@ -1474,35 +1477,58 @@ public abstract class AbstractPersonRepositoryIntegrationTests {
@ -126,6 +128,31 @@ public class MongoParametersParameterAccessorUnitTests {
@@ -126,6 +128,31 @@ public class MongoParametersParameterAccessorUnitTests {
@ -138,5 +165,7 @@ public class MongoParametersParameterAccessorUnitTests {
@@ -138,5 +165,7 @@ public class MongoParametersParameterAccessorUnitTests {
@ -289,6 +289,56 @@ lower / upper bounds (`$gt` / `$gte` & `$lt` / `$lte`) according to `Range`
@@ -289,6 +289,56 @@ lower / upper bounds (`$gt` / `$gte` & `$lt` / `$lte`) according to `Range`
NOTE: If the property criterion compares a document, the order of the fields and exact equality in the document matters.
[[mongodb.repositories.queries.update]]
=== Repository Update Methods
The keywords in the preceding table can also be used to create queries that identify matching documents for running updates on them.
The actual update action is defined via the `@Update` annotation on the method itself as shown in the snippet below. +
Please note that the naming schema for derived queries starts with `find`.
Using _update_ (as in `updateAllByLastname(...)`) is only allowed in combination with `@Query`.
The update is applied to *all* matching documents and it is *not* possible to limit the scope by passing in a `Page` nor using any of the <<repositories.limit-query-result,limiting keywords>>. +
The return type can be either `void` or a _numeric_ type, such as `long` which holds the number of modified documents.
.Update Methods
====
[source,java]
----
public interface PersonRepository extends CrudRepository<Person, String> {
@Update("{ '$inc' : { 'visits' : 1 } }")
long findAndIncrementVisitsByLastname(String lastname); <1>
@Update("{ '$inc' : { 'visits' : ?1 } }")
void findAndIncrementVisitsByLastname(String lastname, int increment); <2>
@Update("{ '$inc' : { 'visits' : ?#{[1]} } }")
long findAndIncrementVisitsUsingSpELByLastname(String lastname, int increment); <3>