diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java index edc74c331..d40343111 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java @@ -412,6 +412,12 @@ public interface MongoOperations { */ T findOne(Query query, Class entityClass, String collectionName); + boolean exists(Query query, String collectionName); + + boolean exists(Query query, Class entityClass); + + boolean exists(Query query, Class entityClass, String collectionName); + /** * Map the results of an ad-hoc query on the collection for the entity class to a List of the specified type. *

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 cdfe7ad63..808bb2fe7 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 @@ -481,6 +481,24 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { } } + public boolean exists(Query query, Class entityClass) { + return exists(query, entityClass, determineCollectionName(entityClass)); + } + + public boolean exists(Query query, String collectionName) { + return exists(query, null, collectionName); + } + + public boolean exists(Query query, Class entityClass, String collectionName) { + + if (query == null) { + throw new InvalidDataAccessApiUsageException("Query passed in to exist can't be null"); + } + + DBObject mappedQuery = mapper.getMappedObject(query.getQueryObject(), getPersistentEntity(entityClass)); + return execute(collectionName, new FindCallback(mappedQuery)).hasNext(); + } + // Find methods that take a Query to express the query and that return a List of objects. public List find(Query query, Class entityClass) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java index c5f7805f1..ba1b5b95e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java @@ -49,13 +49,14 @@ public class SimpleMongoRepository implements MongoR /** * Creates a ew {@link SimpleMongoRepository} for the given {@link MongoEntityInformation} and {@link MongoTemplate}. * - * @param metadata - * @param template + * @param metadata must not be {@literal null}. + * @param template must not be {@literal null}. */ public SimpleMongoRepository(MongoEntityInformation metadata, MongoOperations mongoOperations) { Assert.notNull(mongoOperations); Assert.notNull(metadata); + this.entityInformation = metadata; this.mongoOperations = mongoOperations; } @@ -114,11 +115,8 @@ public class SimpleMongoRepository implements MongoR public boolean exists(ID id) { Assert.notNull(id, "The given id must not be null!"); - - final Query idQuery = getIdQuery(id); - idQuery.fields(); - - return mongoOperations.findOne(idQuery, entityInformation.getJavaType(), entityInformation.getCollectionName()) != null; + return mongoOperations.exists(getIdQuery(id), entityInformation.getJavaType(), + entityInformation.getCollectionName()); } /* @@ -126,7 +124,6 @@ public class SimpleMongoRepository implements MongoR * @see org.springframework.data.repository.CrudRepository#count() */ public long count() { - return mongoOperations.getCollection(entityInformation.getCollectionName()).count(); } @@ -166,7 +163,6 @@ public class SimpleMongoRepository implements MongoR * @see org.springframework.data.repository.CrudRepository#deleteAll() */ public void deleteAll() { - mongoOperations.remove(new Query(), entityInformation.getCollectionName()); } @@ -227,7 +223,6 @@ public class SimpleMongoRepository implements MongoR * @return */ protected MongoOperations getMongoOperations() { - return this.mongoOperations; } @@ -235,7 +230,6 @@ public class SimpleMongoRepository implements MongoR * @return the entityInformation */ protected MongoEntityInformation getEntityInformation() { - return entityInformation; } } 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 f699cd1dd..6689ab43e 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 @@ -1612,6 +1612,19 @@ public class MongoTemplateTests { assertThat(result.get(0).containsField("first"), is(true)); } + @Test + public void executesExistsCorrectly() { + + Sample sample = new Sample(); + template.save(sample); + + Query query = query(where("id").is(sample.id)); + + assertThat(template.exists(query, Sample.class), is(true)); + assertThat(template.exists(query(where("_id").is(sample.id)), template.getCollectionName(Sample.class)), is(true)); + assertThat(template.exists(query, Sample.class, template.getCollectionName(Sample.class)), is(true)); + } + static class MyId { String first;