diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Criteria.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Criteria.java index beb0c68a9..621eff83a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Criteria.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Criteria.java @@ -123,7 +123,7 @@ public class Criteria implements CriteriaDefinition { * @return */ public Criteria nin(Object... o) { - criteria.put("$min", o); + criteria.put("$nin", o); return this; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryCreator.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryCreator.java index e4e07acc0..f5478b68d 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryCreator.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryCreator.java @@ -17,6 +17,7 @@ package org.springframework.data.document.mongodb.repository; import static org.springframework.data.document.mongodb.query.Criteria.*; +import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.regex.Pattern; @@ -141,6 +142,10 @@ class MongoQueryCreator extends AbstractQueryCreator { return criteria.not().is(null); case IS_NULL: return criteria.is(null); + case NOT_IN: + return criteria.nin(nextAsArray(parameters)); + case IN: + return criteria.in(nextAsArray(parameters)); case LIKE: String value = parameters.next().toString(); return criteria.is(toLikeRegex(value)); @@ -154,6 +159,17 @@ class MongoQueryCreator extends AbstractQueryCreator { } + private Object[] nextAsArray(Iterator iterator) { + Object next = iterator.next(); + + if (next instanceof Collection) { + return ((Collection) next).toArray(); + } else if (next.getClass().isArray()) { + return (Object[]) next; + } + + return new Object[] { next }; + } private Pattern toLikeRegex(String source) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java index 353aa34c6..14e31afe0 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java @@ -162,4 +162,21 @@ public abstract class AbstractPersonRepositoryIntegrationTests { assertThat(result.size(), is(1)); assertThat(result, hasItem(dave)); } + + + @Test + public void findsPeopleByFirstnameInVarargs() { + + List result = repository.findByFirstnameIn("Dave", "Carter"); + assertThat(result.size(), is(2)); + assertThat(result, hasItems(dave, carter)); + } + + @Test + public void findsPeopleByFirstnameNotInCollection() { + + List result = repository.findByFirstnameNotIn(Arrays.asList("Boyd", "Carter")); + assertThat(result.size(), is(3)); + assertThat(result, hasItems(dave, leroi, stefan)); + } } \ No newline at end of file diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java index d9a0752db..b04bb88c5 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java @@ -15,6 +15,7 @@ */ package org.springframework.data.document.mongodb.repository; +import java.util.Collection; import java.util.List; import org.springframework.data.domain.Page; @@ -67,6 +68,21 @@ public interface PersonRepository extends MongoRepository { */ Page findByLastnameLike(String lastname, Pageable pageable); + /** + * Returns all {@link Person}s with a firstname contained in the given varargs. + * + * @param firstnames + * @return + */ + List findByFirstnameIn(String... firstnames); + + /** + * Returns all {@link Person}s with a firstname not contained in the given collection. + * + * @param firstnames + * @return + */ + List findByFirstnameNotIn(Collection firstnames); /** * Returns all {@link Person}s with an age between the two given values. diff --git a/src/main/resources/changelog.txt b/src/main/resources/changelog.txt index 4c1af42cd..19ef84cf4 100644 --- a/src/main/resources/changelog.txt +++ b/src/main/resources/changelog.txt @@ -6,6 +6,7 @@ Changes in version 1.0.0.M2 MongoDB Repository * Adapted new metamodel API (DATADOC-47, DATACMNS-17) +* Added support for 'In' and 'NotIn' keyword (DATADOC-46) Changes in version 1.0.0.M1 MongoDB (2011-02-14) ------------------------------------------------