diff --git a/pom.xml b/pom.xml
index c3245aad49..a24187e684 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.5.0-SNAPSHOT
+ 4.5.x-GH-4850-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index 58c63dfc97..cf2d1cb566 100644
--- a/spring-data-mongodb-distribution/pom.xml
+++ b/spring-data-mongodb-distribution/pom.xml
@@ -15,7 +15,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.5.0-SNAPSHOT
+ 4.5.x-GH-4850-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index 98516a5ba9..bda015c6dc 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -13,7 +13,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.5.0-SNAPSHOT
+ 4.5.x-GH-4850-SNAPSHOT
../pom.xml
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 fc25e15c0c..3c05c22227 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
@@ -945,8 +945,17 @@ protected Document getSingleCriteriaObject() {
Document queryCriteria = new Document();
if (!NOT_SET.equals(isValue)) {
- queryCriteria.put(this.key, this.isValue);
- queryCriteria.putAll(document);
+ if(document.isEmpty()) {
+ queryCriteria.put(this.key, this.isValue);
+ }
+ else {
+ if(isValue instanceof Pattern || isValue instanceof BsonRegularExpression) {
+ document.put("$regex", isValue);
+ } else {
+ document.put("$eq", isValue);
+ }
+ queryCriteria.put(this.key, document);
+ }
} else {
queryCriteria.put(this.key, document);
}
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 645f75066a..14448bb052 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
@@ -20,7 +20,9 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.regex.Pattern;
+import org.bson.BsonRegularExpression;
import org.bson.Document;
import org.junit.Test;
import org.springframework.data.geo.Point;
@@ -50,6 +52,44 @@ public void testSimpleCriteria() {
assertThat(c.getCriteriaObject()).isEqualTo("{ \"name\" : \"Bubba\"}");
}
+ @Test // GH-4850
+ public void testCombiningSimpleCriteria() {
+
+ Document expected = Document.parse("{ name : { $eq : 123, $type : ['long'] } }");
+
+ Criteria c = Criteria.where("name") //
+ .is(123) //
+ .type(Type.INT_64);
+
+ assertThat(c.getCriteriaObject()).isEqualTo(expected);
+
+ c = Criteria.where("name") //
+ .type(Type.INT_64)
+ .is(123);
+
+ assertThat(c.getCriteriaObject()).isEqualTo(expected);
+ }
+
+ @Test // GH-4850
+ public void testCombiningBsonRegexCriteria() {
+
+ Criteria c = Criteria.where("name")
+ .regex(new BsonRegularExpression("^spring$"))
+ .type(Type.INT_64);
+
+ assertThat(c.getCriteriaObject()).isEqualTo(Document.parse("{ name : { $regex : RegExp('^spring$'), $type : ['long'] } }"));
+ }
+
+ @Test // GH-4850
+ public void testCombiningRegexCriteria() {
+
+ Criteria c = Criteria.where("name")
+ .regex("^spring$")
+ .type(Type.INT_64);
+
+ assertThat(c.getCriteriaObject()).hasEntrySatisfying("name.$regex", it -> assertThat(it).isInstanceOf(Pattern.class));
+ }
+
@Test
public void testNotEqualCriteria() {
Criteria c = new Criteria("name").ne("Bubba");