diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java
index 3ec4caf3c..df167330a 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java
@@ -394,11 +394,15 @@ public class Criteria implements CriteriaDefinition {
/**
* Creates a criterion using the {@literal $sampleRate} operator.
*
- * @param sampleRate sample rate to determine number of documents to be randomly selected from the input.
+ * @param sampleRate sample rate to determine number of documents to be randomly selected from the input. Must be
+ * between {@code 0} and {@code 1}.
* @return this.
- * @see MongoDB Query operator: $sampleRate
+ * @see MongoDB Query operator:
+ * $sampleRate
+ * @since 3.3
*/
public Criteria sampleRate(double sampleRate) {
+
Assert.isTrue(sampleRate >= 0, "The sample rate must be greater than zero!");
Assert.isTrue(sampleRate <= 1, "The sample rate must not be greater than one!");
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java
index e24fc34be..96253e4ac 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java
@@ -40,19 +40,20 @@ import org.springframework.data.mongodb.core.schema.MongoJsonSchema;
* @author Ziemowit Stolarczyk
* @author Clément Petit
* @author Mark Paluch
+ * @author James McNee
*/
public class CriteriaUnitTests {
@Test
public void testSimpleCriteria() {
Criteria c = new Criteria("name").is("Bubba");
- assertThat(c.getCriteriaObject()).isEqualTo(Document.parse("{ \"name\" : \"Bubba\"}"));
+ assertThat(c.getCriteriaObject()).isEqualTo("{ \"name\" : \"Bubba\"}");
}
@Test
public void testNotEqualCriteria() {
Criteria c = new Criteria("name").ne("Bubba");
- assertThat(c.getCriteriaObject()).isEqualTo(Document.parse("{ \"name\" : { \"$ne\" : \"Bubba\"}}"));
+ assertThat(c.getCriteriaObject()).isEqualTo("{ \"name\" : { \"$ne\" : \"Bubba\"}}");
}
@Test
@@ -67,7 +68,7 @@ public class CriteriaUnitTests {
@Test
public void testChainedCriteria() {
Criteria c = new Criteria("name").is("Bubba").and("age").lt(21);
- assertThat(c.getCriteriaObject()).isEqualTo(Document.parse("{ \"name\" : \"Bubba\" , \"age\" : { \"$lt\" : 21}}"));
+ assertThat(c.getCriteriaObject()).isEqualTo("{ \"name\" : \"Bubba\" , \"age\" : { \"$lt\" : 21}}");
}
@Test(expected = InvalidMongoDbApiUsageException.class)
@@ -153,13 +154,13 @@ public class CriteriaUnitTests {
Document co = c.getCriteriaObject();
assertThat(co).isNotNull();
- assertThat(co).isEqualTo(Document.parse("{ \"age\" : { \"$not\" : { \"$gt\" : 18}} , \"status\" : \"student\"}"));
+ assertThat(co).isEqualTo("{ \"age\" : { \"$not\" : { \"$gt\" : 18}} , \"status\" : \"student\"}");
}
@Test // GH-3726
public void shouldBuildCorrectSampleRateOperation() {
Criteria c = new Criteria().sampleRate(0.4);
- assertThat(c.getCriteriaObject()).isEqualTo(Document.parse("{ \"$sampleRate\" : 0.4 }"));
+ assertThat(c.getCriteriaObject()).isEqualTo("{ \"$sampleRate\" : 0.4 }");
}
@Test // GH-3726
@@ -302,7 +303,7 @@ public class CriteriaUnitTests {
Criteria numericBitmaskCriteria = new Criteria("field").bits().allClear(0b101);
assertThat(numericBitmaskCriteria.getCriteriaObject())
- .isEqualTo(Document.parse("{ \"field\" : { \"$bitsAllClear\" : 5} }"));
+ .isEqualTo("{ \"field\" : { \"$bitsAllClear\" : 5} }");
}
@Test // DATAMONGO-1808
@@ -311,7 +312,7 @@ public class CriteriaUnitTests {
Criteria bitPositionsBitmaskCriteria = new Criteria("field").bits().allClear(Arrays.asList(0, 2));
assertThat(bitPositionsBitmaskCriteria.getCriteriaObject())
- .isEqualTo(Document.parse("{ \"field\" : { \"$bitsAllClear\" : [ 0, 2 ]} }"));
+ .isEqualTo("{ \"field\" : { \"$bitsAllClear\" : [ 0, 2 ]} }");
}
@Test // DATAMONGO-1808
@@ -320,7 +321,7 @@ public class CriteriaUnitTests {
Criteria numericBitmaskCriteria = new Criteria("field").bits().allSet(0b101);
assertThat(numericBitmaskCriteria.getCriteriaObject())
- .isEqualTo(Document.parse("{ \"field\" : { \"$bitsAllSet\" : 5} }"));
+ .isEqualTo("{ \"field\" : { \"$bitsAllSet\" : 5} }");
}
@Test // DATAMONGO-1808
@@ -329,7 +330,7 @@ public class CriteriaUnitTests {
Criteria bitPositionsBitmaskCriteria = new Criteria("field").bits().allSet(Arrays.asList(0, 2));
assertThat(bitPositionsBitmaskCriteria.getCriteriaObject())
- .isEqualTo(Document.parse("{ \"field\" : { \"$bitsAllSet\" : [ 0, 2 ]} }"));
+ .isEqualTo("{ \"field\" : { \"$bitsAllSet\" : [ 0, 2 ]} }");
}
@Test // DATAMONGO-1808
@@ -338,7 +339,7 @@ public class CriteriaUnitTests {
Criteria numericBitmaskCriteria = new Criteria("field").bits().anyClear(0b101);
assertThat(numericBitmaskCriteria.getCriteriaObject())
- .isEqualTo(Document.parse("{ \"field\" : { \"$bitsAnyClear\" : 5} }"));
+ .isEqualTo("{ \"field\" : { \"$bitsAnyClear\" : 5} }");
}
@Test // DATAMONGO-1808
@@ -347,7 +348,7 @@ public class CriteriaUnitTests {
Criteria bitPositionsBitmaskCriteria = new Criteria("field").bits().anyClear(Arrays.asList(0, 2));
assertThat(bitPositionsBitmaskCriteria.getCriteriaObject())
- .isEqualTo(Document.parse("{ \"field\" : { \"$bitsAnyClear\" : [ 0, 2 ]} }"));
+ .isEqualTo("{ \"field\" : { \"$bitsAnyClear\" : [ 0, 2 ]} }");
}
@Test // DATAMONGO-1808
@@ -356,7 +357,7 @@ public class CriteriaUnitTests {
Criteria numericBitmaskCriteria = new Criteria("field").bits().anySet(0b101);
assertThat(numericBitmaskCriteria.getCriteriaObject())
- .isEqualTo(Document.parse("{ \"field\" : { \"$bitsAnySet\" : 5} }"));
+ .isEqualTo("{ \"field\" : { \"$bitsAnySet\" : 5} }");
}
@Test // DATAMONGO-1808
@@ -365,7 +366,7 @@ public class CriteriaUnitTests {
Criteria bitPositionsBitmaskCriteria = new Criteria("field").bits().anySet(Arrays.asList(0, 2));
assertThat(bitPositionsBitmaskCriteria.getCriteriaObject())
- .isEqualTo(Document.parse("{ \"field\" : { \"$bitsAnySet\" : [ 0, 2 ]} }"));
+ .isEqualTo("{ \"field\" : { \"$bitsAnySet\" : [ 0, 2 ]} }");
}
@Test // DATAMONGO-2002
diff --git a/src/main/asciidoc/reference/mongo-repositories.adoc b/src/main/asciidoc/reference/mongo-repositories.adoc
index b847174c6..328a547b5 100644
--- a/src/main/asciidoc/reference/mongo-repositories.adoc
+++ b/src/main/asciidoc/reference/mongo-repositories.adoc
@@ -281,10 +281,6 @@ lower / upper bounds (`$gt` / `$gte` & `$lt` / `$lte`) according to `Range`
| `Exists`
| `findByLocationExists(boolean exists)`
| `{"location" : {"$exists" : exists }}`
-
-| `SampleRate`
-| `sampleRate(double sampleRate)`
-| `{"$sampleRate" : sampleRate }`
|===
NOTE: If the property criterion compares a document, the order of the fields and exact equality in the document matters.
diff --git a/src/main/asciidoc/reference/mongodb.adoc b/src/main/asciidoc/reference/mongodb.adoc
index f214edba4..7bf034f46 100644
--- a/src/main/asciidoc/reference/mongodb.adoc
+++ b/src/main/asciidoc/reference/mongodb.adoc
@@ -1219,6 +1219,7 @@ The `Criteria` class provides the following methods, all of which correspond to
* `Criteria` *orOperator* `(Criteria... criteria)` Creates an or query using the `$or` operator for all of the provided criteria
* `Criteria` *orOperator* `(Collection criteria)` Creates an or query using the `$or` operator for all of the provided criteria
* `Criteria` *regex* `(String re)` Creates a criterion using a `$regex`
+* `Criteria` *sampleRate* `(double sampleRate)` Creates a criterion using the `$sampleRate` operator
* `Criteria` *size* `(int s)` Creates a criterion using the `$size` operator
* `Criteria` *type* `(int t)` Creates a criterion using the `$type` operator
* `Criteria` *matchingDocumentStructure* `(MongoJsonSchema schema)` Creates a criterion using the `$jsonSchema` operator for <>. `$jsonSchema` can only be applied on the top level of a query and not property specific. Use the `properties` attribute of the schema to match against nested fields.