diff --git a/pom.xml b/pom.xml
index ded4d85d02..d81c079a2d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.5.0-SNAPSHOT
+ 4.5.x-GH-4918-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index 58c63dfc97..d7a46f6f11 100644
--- a/spring-data-mongodb-distribution/pom.xml
+++ b/spring-data-mongodb-distribution/pom.xml
@@ -15,7 +15,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.5.0-SNAPSHOT
+ 4.5.x-GH-4918-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index 37e68c6f78..90cfbc7d74 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -13,7 +13,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.5.0-SNAPSHOT
+ 4.5.x-GH-4918-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/BasicUpdate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/BasicUpdate.java
index bf29d25e6b..12843ce622 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/BasicUpdate.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/BasicUpdate.java
@@ -15,13 +15,21 @@
*/
package org.springframework.data.mongodb.core.query;
-import java.util.Arrays;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
import org.bson.Document;
+
import org.springframework.lang.Nullable;
+import org.springframework.util.ClassUtils;
/**
+ * {@link Document}-based {@link Update} variant.
+ *
* @author Thomas Risberg
* @author John Brisbin
* @author Oliver Gierke
@@ -33,74 +41,114 @@ public class BasicUpdate extends Update {
private final Document updateObject;
public BasicUpdate(String updateString) {
- super();
- this.updateObject = Document.parse(updateString);
+ this(Document.parse(updateString));
}
public BasicUpdate(Document updateObject) {
- super();
this.updateObject = updateObject;
}
@Override
public Update set(String key, @Nullable Object value) {
- updateObject.put("$set", Collections.singletonMap(key, value));
+ setOperationValue("$set", key, value);
return this;
}
@Override
public Update unset(String key) {
- updateObject.put("$unset", Collections.singletonMap(key, 1));
+ setOperationValue("$unset", key, 1);
return this;
}
@Override
public Update inc(String key, Number inc) {
- updateObject.put("$inc", Collections.singletonMap(key, inc));
+ setOperationValue("$inc", key, inc);
return this;
}
@Override
public Update push(String key, @Nullable Object value) {
- updateObject.put("$push", Collections.singletonMap(key, value));
+ setOperationValue("$push", key, value);
return this;
}
@Override
public Update addToSet(String key, @Nullable Object value) {
- updateObject.put("$addToSet", Collections.singletonMap(key, value));
+ setOperationValue("$addToSet", key, value);
return this;
}
@Override
public Update pop(String key, Position pos) {
- updateObject.put("$pop", Collections.singletonMap(key, (pos == Position.FIRST ? -1 : 1)));
+ setOperationValue("$pop", key, (pos == Position.FIRST ? -1 : 1));
return this;
}
@Override
public Update pull(String key, @Nullable Object value) {
- updateObject.put("$pull", Collections.singletonMap(key, value));
+ setOperationValue("$pull", key, value);
return this;
}
@Override
public Update pullAll(String key, Object[] values) {
- Document keyValue = new Document();
- keyValue.put(key, Arrays.copyOf(values, values.length));
- updateObject.put("$pullAll", keyValue);
+ setOperationValue("$pullAll", key, List.of(values), (o, o2) -> {
+
+ if (o instanceof List> prev && o2 instanceof List> currentValue) {
+ List