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 74c29238b..79ef4ce7a 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 @@ -428,6 +428,12 @@ public class MongoTemplateTests { assertThat(p.getAge(), is(26)); p = template.findOne(query, Person.class); assertThat(p.getAge(), is(27)); + + Query query2 = new Query(Criteria.where("firstName").is("Mary")); + p = template.findAndModify(query2, update, new FindAndModifyOptions().returnNew(true).upsert(true), Person.class); + assertThat(p.getFirstName(), is("Mary")); + assertThat(p.getAge(), is(1)); + } @Test diff --git a/src/docbkx/reference/mongodb.xml b/src/docbkx/reference/mongodb.xml index 1dccb1d60..e67027b32 100644 --- a/src/docbkx/reference/mongodb.xml +++ b/src/docbkx/reference/mongodb.xml @@ -1398,6 +1398,54 @@ import static org.springframework.data.mongodb.core.query.Update; template.upsert(query(where("ssn").is(1111).and("firstName").is("Joe").and("Fraizer").is("Update")), update("address", addr), Person.class); +
+ Finding and Upserting documents in a collection + + The findAndModify method on DBCollection can update a document and + return either the old or newly updated document in a single operation. + MongoTemplate provides a findAndModify method that takes Query and + Update classes and converts from DBObject to your POJOs. Here are the + methods + + <T> T findAndModify(Query query, Update update, Class<T> entityClass); + + <T> T findAndModify(Query query, Update update, Class<T> entityClass, String collectionName); + + <T> T findAndModify(Query query, Update update, FindAndModifyOptions options, Class<T> entityClass); + + <T> T findAndModify(Query query, Update update, FindAndModifyOptions options, Class<T> entityClass, String collectionName); + + As an example usage, we will insert of few Person objects into the + container and perform a simple findAndUpdate operation + + mongoTemplate.insert(new Person("Tom", 21)); +mongoTemplate.insert(new Person("Dick", 22)); +mongoTemplate.insert(new Person("Harry", 23)); + +Query query = new Query(Criteria.where("firstName").is("Harry")); +Update update = new Update().inc("age", 1); +Person p = mongoTemplate.findAndModify(query, update, Person.class); // return's old person object + +assertThat(p.getFirstName(), is("Harry")); +assertThat(p.getAge(), is(23)); +p = mongoTemplate.findOne(query, Person.class); +assertThat(p.getAge(), is(24)); + + +// Now return the newly updated document when updating +p = template.findAndModify(query, update, new FindAndModifyOptions().returnNew(true), Person.class); +assertThat(p.getAge(), is(25)); + + The FindAndModifyOptions lets you set the + options of returnNew, upsert, and remove. An example extending off the + previous code snippit is shown below + + Query query2 = new Query(Criteria.where("firstName").is("Mary")); +p = mongoTemplate.findAndModify(query2, update, new FindAndModifyOptions().returnNew(true).upsert(true), Person.class); +assertThat(p.getFirstName(), is("Mary")); +assertThat(p.getAge(), is(1)); +
+
Methods for removing documents @@ -2311,7 +2359,7 @@ public class PersonWriteConverter implements Converter<Person, DBObject> { defined on the collectcion. Here is an example that defines an index on the Person class that has age property. - template.indexOps(Person.class).ensureIndex(new Index().on("age", Order.DESCENDING).unique(Duplicates.DROP)); + template.indexOps(Person.class).ensureIndex(new Index().on("age", Order.DESCENDING).unique(Duplicates.DROP)); List<IndexInfo> indexInfoList = template.indexOps(Person.class).getIndexInfo();