diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Update.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Update.java
index cb74f434b..e75c844f9 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Update.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Update.java
@@ -196,6 +196,18 @@ public class Update {
return this;
}
+ /**
+ * Update using {@code $addToSet} modifier.
+ * Allows creation of {@code $push} command for single or multiple (using {@code $each}) values
+ *
+ * @param key
+ * @return
+ * @since 1.5
+ */
+ public AddToSetBuilder addToSet(String key) {
+ return new AddToSetBuilder(key);
+ }
+
/**
* Update using the {@literal $addToSet} update modifier
*
@@ -408,7 +420,7 @@ public class Update {
/**
* Builder for creating {@code $push} modifiers
*
- * @author Christop Strobl
+ * @author Christoph Strobl
*/
public class PushOperatorBuilder {
@@ -442,4 +454,41 @@ public class Update {
return Update.this.push(key, value);
}
}
+
+ /**
+ * Builder for creating {@code $addToSet} modifier.
+ *
+ * @author Christoph Strobl
+ * @since 1.5
+ */
+ public class AddToSetBuilder {
+
+ private final String key;
+
+ public AddToSetBuilder(String key) {
+ this.key = key;
+ }
+
+ /**
+ * Propagates {@code $each} to {@code $addToSet}
+ *
+ * @param values
+ * @return
+ */
+ public Update each(Object... values) {
+ return Update.this.addToSet(this.key, new Each(values));
+ }
+
+ /**
+ * Propagates {@link #value(Object)} to {@code $addToSet}
+ *
+ * @param values
+ * @return
+ */
+ public Update value(Object value) {
+ return Update.this.addToSet(this.key, value);
+ }
+
+ }
+
}
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 f3cc79f94..dcae2936c 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
@@ -2580,6 +2580,25 @@ public class MongoTemplateTests {
assertThat(savedTmpl.getContent().getText(), is(nullValue()));
}
+ /**
+ * @see DATAMONGO-471
+ */
+ @Test
+ public void updateMultiShouldAddValuesCorrectlyWhenUsingAddToSetWithEach() {
+
+ DocumentWithCollectionOfSimpleType document = new DocumentWithCollectionOfSimpleType();
+ document.values = Arrays.asList("spring");
+ template.save(document);
+
+ Query query = query(where("id").is(document.id));
+ assumeThat(template.findOne(query, DocumentWithCollectionOfSimpleType.class).values, hasSize(1));
+
+ Update update = new Update().addToSet("values").each("data", "mongodb");
+ template.updateMulti(query, update, DocumentWithCollectionOfSimpleType.class);
+
+ assertThat(template.findOne(query, DocumentWithCollectionOfSimpleType.class).values, hasSize(3));
+ }
+
static class DocumentWithDBRefCollection {
@Id public String id;
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java
index fbc6dd719..818f2cf41 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java
@@ -412,6 +412,46 @@ public class UpdateMapperUnitTests {
assertThat(inClause, IsIterableContainingInOrder.