diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index ba59d8605..33bf89e97 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -1603,9 +1603,7 @@ public class MongoTemplate MongoPersistentEntity entity = mappingContext.getPersistentEntity(entityClass); UpdateContext updateContext = queryOperations.replaceSingleContext(mapped, true); Document replacement = updateContext.getMappedUpdate(entity); - - Document filter = updateContext.getMappedQuery(entity); - + Document filter = updateContext.getReplacementQuery(); if (updateContext.requiresShardKey(filter, entity)) { if (entity.getShardKey().isImmutable()) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryOperations.java index fabe52f3a..9a862cf2c 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryOperations.java @@ -400,7 +400,7 @@ class QueryOperations { for (Entry entry : fields.entrySet()) { - if (entry.getValue()instanceof MongoExpression mongoExpression) { + if (entry.getValue() instanceof MongoExpression mongoExpression) { AggregationOperationContext ctx = entity == null ? Aggregation.DEFAULT_CONTEXT : new RelaxedTypeBasedAggregationOperationContext(entity.getType(), mappingContext, queryMapper); @@ -809,13 +809,23 @@ class QueryOperations { @Override Document getMappedQuery(@Nullable MongoPersistentEntity domainType) { + return applyIsolation(super.getMappedQuery(domainType)); + } - Document mappedQuery = super.getMappedQuery(domainType); + /** + * A replacement query that is derived from the already {@link MappedDocument}. + * + * @return + */ + Document getReplacementQuery() { + return applyIsolation(getQueryObject()); + } + private Document applyIsolation(Document mappedQuery) { if (multi && update != null && update.isIsolated() && !mappedQuery.containsKey("$isolated")) { + mappedQuery = new Document(mappedQuery); mappedQuery.put("$isolated", 1); } - return mappedQuery; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java index 99dfea85e..10ae7a9ea 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java @@ -1649,7 +1649,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati MongoPersistentEntity entity = mappingContext.getPersistentEntity(entityClass); UpdateContext updateContext = queryOperations.replaceSingleContext(mapped, true); - Document filter = updateContext.getMappedQuery(entity); + Document filter = updateContext.getReplacementQuery(); Document replacement = updateContext.getMappedUpdate(entity); Mono deferredFilter; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java index 7fa4da340..3d27e20f3 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java @@ -728,7 +728,7 @@ public class QueryMapper { } else if (isKeyword(key)) { resultDbo.put(key, convertIdField(documentField, entry.getValue())); } else { - if(documentField.getProperty() != null && documentField.getProperty().isEntity()) { + if (documentField.getProperty() != null && documentField.getProperty().isEntity()) { Field propertyField = createPropertyField(documentField.getPropertyEntity(), key, mappingContext); resultDbo.put(key, getMappedValue(propertyField, entry.getValue())); } else { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index c1126165d..6a2e1961f 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -1416,7 +1416,7 @@ public class MongoTemplateTests { id.id = Instant.now().minusSeconds(2); id.first = "foo"; id.second = "bar"; - id.time = Instant.now().minusSeconds(3); + id.id = Instant.now().minusSeconds(3); TypeWithMyId source = new TypeWithMyId(); source.id = id; @@ -4423,7 +4423,7 @@ public class MongoTemplateTests { String first; String second; - Instant time; + Instant id; @Field("t") Instant time; }