diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ConvertOperators.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ConvertOperators.java
new file mode 100644
index 000000000..3a65b4abb
--- /dev/null
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ConvertOperators.java
@@ -0,0 +1,693 @@
+/*
+ * Copyright 2018 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.data.mongodb.core.aggregation;
+
+import java.util.Collections;
+
+import org.springframework.data.mongodb.core.schema.JsonSchemaObject.Type;
+import org.springframework.lang.Nullable;
+import org.springframework.util.Assert;
+
+/**
+ * Gateway to {@literal convert} aggregation operations.
+ *
+ * @author Christoph Strobl
+ * @since 2.1
+ */
+public class ConvertOperators {
+
+ /**
+ * Take the value referenced by given {@literal fieldReference}.
+ *
+ * @param fieldReference must not be {@literal null}.
+ * @return
+ */
+ public static ConvertOperatorFactory valueOf(String fieldReference) {
+ return new ConvertOperatorFactory(fieldReference);
+ }
+
+ /**
+ * Take the value provided by the given {@link AggregationExpression}.
+ *
+ * @param expression must not be {@literal null}.
+ * @return
+ */
+ public static ConvertOperatorFactory valueOf(AggregationExpression expression) {
+ return new ConvertOperatorFactory(expression);
+ }
+
+ /**
+ * @author Christoph Strobl
+ */
+ public static class ConvertOperatorFactory {
+
+ private final @Nullable String fieldReference;
+ private final @Nullable AggregationExpression expression;
+
+ /**
+ * Creates new {@link ConvertOperatorFactory} for given {@literal fieldReference}.
+ *
+ * @param fieldReference must not be {@literal null}.
+ */
+ public ConvertOperatorFactory(String fieldReference) {
+
+ Assert.notNull(fieldReference, "FieldReference must not be null!");
+ this.fieldReference = fieldReference;
+ this.expression = null;
+ }
+
+ /**
+ * Creates new {@link ConvertOperatorFactory} for given {@link AggregationExpression}.
+ *
+ * @param expression must not be {@literal null}.
+ */
+ public ConvertOperatorFactory(AggregationExpression expression) {
+
+ Assert.notNull(expression, "Expression must not be null!");
+ this.fieldReference = null;
+ this.expression = expression;
+ }
+
+ /**
+ * Creates new {@link Convert aggregation expression} that takes the associated value and converts it into the type
+ * specified by the given identifier.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @param stringTypeIdentifier must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert convertTo(String stringTypeIdentifier) {
+ return createConvert().to(stringTypeIdentifier);
+ }
+
+ /**
+ * Creates new {@link Convert aggregation expression} that takes the associated value and converts it into the type
+ * specified by the given identifier.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @param numericTypeIdentifier must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert convertTo(int numericTypeIdentifier) {
+ return createConvert().to(numericTypeIdentifier);
+ }
+
+ /**
+ * Creates new {@link Convert aggregation expression} that takes the associated value and converts it into the type
+ * specified by the given type.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @param type must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert convertTo(Type type) {
+ return createConvert().to(type);
+ }
+
+ /**
+ * Creates new {@link Convert aggregation expression} that takes the associated value and converts it into the type
+ * specified by the value of the given {@link Field field reference}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @param fieldReference must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert convertToTypeOf(String fieldReference) {
+ return createConvert().toTypeOf(fieldReference);
+ }
+
+ /**
+ * Creates new {@link Convert aggregation expression} that takes the associated value and converts it into the type
+ * specified by the given {@link AggregationExpression expression}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @param expression must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert convertToTypeOf(AggregationExpression expression) {
+ return createConvert().toTypeOf(expression);
+ }
+
+ /**
+ * Creates new {@link ToBool aggregation expression} for {@code $toBool} that converts a value to boolean. Shorthand
+ * for {@link #convertTo(String) #convertTo("bool")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @return new instance of {@link ToBool}.
+ */
+ public ToBool convertToBoolean() {
+ return ToBool.toBoolean(valueObject());
+ }
+
+ /**
+ * Creates new {@link ToDate aggregation expression} for {@code $toDate} that converts a value to a date. Shorthand
+ * for {@link #convertTo(String) #convertTo("date")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @return new instance of {@link ToDate}.
+ */
+ public ToDate convertToDate() {
+ return ToDate.toDate(valueObject());
+ }
+
+ /**
+ * Creates new {@link ToDecimal aggregation expression} for {@code $toDecimal} that converts a value to a decimal.
+ * Shorthand for {@link #convertTo(String) #convertTo("decimal")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @return new instance of {@link ToDecimal}.
+ */
+ public ToDecimal convertToDecimal() {
+ return ToDecimal.toDecimal(valueObject());
+ }
+
+ /**
+ * Creates new {@link ToDouble aggregation expression} for {@code $toDouble} that converts a value to a decimal.
+ * Shorthand for {@link #convertTo(String) #convertTo("double")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @return new instance of {@link ToDouble}.
+ */
+ public ToDouble convertToDouble() {
+ return ToDouble.toDouble(valueObject());
+ }
+
+ /**
+ * Creates new {@link ToInt aggregation expression} for {@code $toInt} that converts a value to an int. Shorthand
+ * for {@link #convertTo(String) #convertTo("int")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @return new instance of {@link ToInt}.
+ */
+ public ToInt convertToInt() {
+ return ToInt.toInt(valueObject());
+ }
+
+ /**
+ * Creates new {@link ToInt aggregation expression} for {@code $toLong} that converts a value to a long. Shorthand
+ * for {@link #convertTo(String) #convertTo("long")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @return new instance of {@link ToInt}.
+ */
+ public ToLong convertToLong() {
+ return ToLong.toLong(valueObject());
+ }
+
+ /**
+ * Creates new {@link ToInt aggregation expression} for {@code $toObjectId} that converts a value to a objectId. Shorthand
+ * for {@link #convertTo(String) #convertTo("objectId")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @return new instance of {@link ToInt}.
+ */
+ public ToObjectId convertToObjectId() {
+ return ToObjectId.toObjectId(valueObject());
+ }
+
+ /**
+ * Creates new {@link ToInt aggregation expression} for {@code $toString} that converts a value to a string. Shorthand
+ * for {@link #convertTo(String) #convertTo("string")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @return new instance of {@link ToInt}.
+ */
+ public ToString convertToString() {
+ return ToString.toString(valueObject());
+ }
+
+ private Convert createConvert() {
+ return usesFieldRef() ? Convert.convertValueOf(fieldReference) : Convert.convertValueOf(expression);
+ }
+
+ private Object valueObject() {
+ return usesFieldRef() ? Fields.field(fieldReference) : expression;
+ }
+
+ private boolean usesFieldRef() {
+ return fieldReference != null;
+ }
+ }
+
+ /**
+ * {@link AggregationExpression} for {@code $convert} that converts a value to a specified type.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @author Christoph Strobl
+ * @see https://docs.mongodb.com/manual/reference/operator/aggregation/convert/
+ * @since 2.1
+ */
+ public static class Convert extends AbstractAggregationExpression {
+
+ private Convert(Object value) {
+ super(value);
+ }
+
+ /**
+ * Creates new {@link Convert} using the given value for the {@literal input} attribute.
+ *
+ * @param value must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public static Convert convertValue(Object value) {
+ return new Convert(Collections.singletonMap("input", value));
+ }
+
+ /**
+ * Creates new {@link Convert} using the value of the provided {@link Field fieldReference} as {@literal input}
+ * value.
+ *
+ * @param fieldReference must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public static Convert convertValueOf(String fieldReference) {
+ return convertValue(Fields.field(fieldReference));
+ }
+
+ /**
+ * Creates new {@link Convert} using the result of the provided {@link AggregationExpression expression} as
+ * {@literal input} value.
+ *
+ * @param expression must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public static Convert convertValueOf(AggregationExpression expression) {
+ return convertValue(expression);
+ }
+
+ /**
+ * Specify the conversion target type via its {@link String} representation.
+ *
+ * - double
+ * - string
+ * - objectId
+ * - bool
+ * - date
+ * - int
+ * - long
+ * - decimal
+ *
+ *
+ * @param stringTypeIdentifier must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert to(String stringTypeIdentifier) {
+ return new Convert(append("to", stringTypeIdentifier));
+ }
+
+ /**
+ * Specify the conversion target type via its numeric representation.
+ *
+ * - 1
+ * - double
+ * - 2
+ * - string
+ *
- 7
+ * - objectId
+ *
- 8
+ * - bool
+ * - 9
+ * - date
+ * - 16
+ * - int
+ * - 18
+ * - long
+ * - 19
+ * - decimal
+ *
+ *
+ * @param numericTypeIdentifier must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert to(int numericTypeIdentifier) {
+ return new Convert(append("to", numericTypeIdentifier));
+ }
+
+ /**
+ * Specify the conversion target type.
+ *
+ * @param type must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert to(Type type) {
+
+ String typeString = Type.BOOLEAN.equals(type) ? "bool" : type.value().toString();
+ return to(typeString);
+ }
+
+ /**
+ * Specify the conversion target type via the value of the given field.
+ *
+ * @param fieldReference must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert toTypeOf(String fieldReference) {
+ return new Convert(append("to", Fields.field(fieldReference)));
+ }
+
+ /**
+ * Specify the conversion target type via the value of the given {@link AggregationExpression expression}.
+ *
+ * @param expression must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert toTypeOf(AggregationExpression expression) {
+ return new Convert(append("to", expression));
+ }
+
+ /**
+ * Optionally specify the value to return on encountering an error during conversion.
+ *
+ * @param value must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert onErrorReturn(Object value) {
+ return new Convert(append("onError", value));
+ }
+
+ /**
+ * Optionally specify the field holding the value to return on encountering an error during conversion.
+ *
+ * @param fieldReference must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert onErrorReturnValueOf(String fieldReference) {
+ return onErrorReturn(Fields.field(fieldReference));
+ }
+
+ /**
+ * Optionally specify the expression to evaluate and return on encountering an error during conversion.
+ *
+ * @param expression must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert onErrorReturnValueOf(AggregationExpression expression) {
+ return onErrorReturn(expression);
+ }
+
+ /**
+ * Optionally specify the value to return when the input is {@literal null} or missing.
+ *
+ * @param value must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert onNullReturn(Object value) {
+ return new Convert(append("onNull", value));
+ }
+
+ /**
+ * Optionally specify the field holding the value to return when the input is {@literal null} or missing.
+ *
+ * @param fieldReference must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert onNullReturnValueOf(String fieldReference) {
+ return onNullReturn(Fields.field(fieldReference));
+ }
+
+ /**
+ * Optionally specify the expression to evaluate and return when the input is {@literal null} or missing.
+ *
+ * @param expression must not be {@literal null}.
+ * @return new instance of {@link Convert}.
+ */
+ public Convert onNullReturnValueOf(AggregationExpression expression) {
+ return onNullReturn(expression);
+ }
+
+ @Override
+ protected String getMongoMethod() {
+ return "$convert";
+ }
+ }
+
+ /**
+ * {@link AggregationExpression} for {@code $toBool} that converts a value to boolean. Shorthand for
+ * {@link Convert#to(String) Convert#to("bool")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @author Christoph Strobl
+ * @see https://docs.mongodb.com/manual/reference/operator/aggregation/toBool/
+ * @since 2.1
+ */
+ public static class ToBool extends AbstractAggregationExpression {
+
+ private ToBool(Object value) {
+ super(value);
+ }
+
+ /**
+ * Creates new {@link ToBool} using the given value as input.
+ *
+ * @param value must not be {@literal null}.
+ * @return new instance of {@link ToBool}.
+ */
+ public static ToBool toBoolean(Object value) {
+ return new ToBool(value);
+ }
+
+ @Override
+ protected String getMongoMethod() {
+ return "$toBool";
+ }
+ }
+
+ /**
+ * {@link AggregationExpression} for {@code $toDate} that converts a value to boolean. Shorthand for
+ * {@link Convert#to(String) Convert#to("date")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @author Christoph Strobl
+ * @see https://docs.mongodb.com/manual/reference/operator/aggregation/toDate/
+ * @since 2.1
+ */
+ public static class ToDate extends AbstractAggregationExpression {
+
+ private ToDate(Object value) {
+ super(value);
+ }
+
+ /**
+ * Creates new {@link ToDate} using the given value as input.
+ *
+ * @param value must not be {@literal null}.
+ * @return new instance of {@link ToDate}.
+ */
+ public static ToDate toDate(Object value) {
+ return new ToDate(value);
+ }
+
+ @Override
+ protected String getMongoMethod() {
+ return "$toDate";
+ }
+ }
+
+ /**
+ * {@link AggregationExpression} for {@code $toDecimal} that converts a value to decimal. Shorthand for
+ * {@link Convert#to(String) Convert#to("decimal")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @author Christoph Strobl
+ * @see https://docs.mongodb.com/manual/reference/operator/aggregation/toDecimal/
+ * @since 2.1
+ */
+ public static class ToDecimal extends AbstractAggregationExpression {
+
+ private ToDecimal(Object value) {
+ super(value);
+ }
+
+ /**
+ * Creates new {@link ToDecimal} using the given value as input.
+ *
+ * @param value must not be {@literal null}.
+ * @return new instance of {@link ToDecimal}.
+ */
+ public static ToDecimal toDecimal(Object value) {
+ return new ToDecimal(value);
+ }
+
+ @Override
+ protected String getMongoMethod() {
+ return "$toDecimal";
+ }
+ }
+
+ /**
+ * {@link AggregationExpression} for {@code $toDouble} that converts a value to double. Shorthand for
+ * {@link Convert#to(String) Convert#to("double")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @author Christoph Strobl
+ * @see https://docs.mongodb.com/manual/reference/operator/aggregation/toDouble/
+ * @since 2.1
+ */
+ public static class ToDouble extends AbstractAggregationExpression {
+
+ private ToDouble(Object value) {
+ super(value);
+ }
+
+ /**
+ * Creates new {@link ToDouble} using the given value as input.
+ *
+ * @param value must not be {@literal null}.
+ * @return new instance of {@link ToDouble}.
+ */
+ public static ToDouble toDouble(Object value) {
+ return new ToDouble(value);
+ }
+
+ @Override
+ protected String getMongoMethod() {
+ return "$toDouble";
+ }
+ }
+
+ /**
+ * {@link AggregationExpression} for {@code $toInt} that converts a value to integer. Shorthand for
+ * {@link Convert#to(String) Convert#to("int")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @author Christoph Strobl
+ * @see https://docs.mongodb.com/manual/reference/operator/aggregation/toInt/
+ * @since 2.1
+ */
+ public static class ToInt extends AbstractAggregationExpression {
+
+ private ToInt(Object value) {
+ super(value);
+ }
+
+ /**
+ * Creates new {@link ToInt} using the given value as input.
+ *
+ * @param value must not be {@literal null}.
+ * @return new instance of {@link ToInt}.
+ */
+ public static ToInt toInt(Object value) {
+ return new ToInt(value);
+ }
+
+ @Override
+ protected String getMongoMethod() {
+ return "$toInt";
+ }
+ }
+
+ /**
+ * {@link AggregationExpression} for {@code $toLong} that converts a value to long. Shorthand for
+ * {@link Convert#to(String) Convert#to("long")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @author Christoph Strobl
+ * @see https://docs.mongodb.com/manual/reference/operator/aggregation/toLong/
+ * @since 2.1
+ */
+ public static class ToLong extends AbstractAggregationExpression {
+
+ private ToLong(Object value) {
+ super(value);
+ }
+
+ /**
+ * Creates new {@link ToLong} using the given value as input.
+ *
+ * @param value must not be {@literal null}.
+ * @return new instance of {@link ToLong}.
+ */
+ public static ToLong toLong(Object value) {
+ return new ToLong(value);
+ }
+
+ @Override
+ protected String getMongoMethod() {
+ return "$toLong";
+ }
+ }
+
+ /**
+ * {@link AggregationExpression} for {@code $toObjectId} that converts a value to objectId. Shorthand for
+ * {@link Convert#to(String) Convert#to("objectId")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @author Christoph Strobl
+ * @see https://docs.mongodb.com/manual/reference/operator/aggregation/toObjectId/
+ * @since 2.1
+ */
+ public static class ToObjectId extends AbstractAggregationExpression {
+
+ private ToObjectId(Object value) {
+ super(value);
+ }
+
+ /**
+ * Creates new {@link ToObjectId} using the given value as input.
+ *
+ * @param value must not be {@literal null}.
+ * @return new instance of {@link ToObjectId}.
+ */
+ public static ToObjectId toObjectId(Object value) {
+ return new ToObjectId(value);
+ }
+
+ @Override
+ protected String getMongoMethod() {
+ return "$toObjectId";
+ }
+ }
+
+ /**
+ * {@link AggregationExpression} for {@code $toString} that converts a value to string. Shorthand for
+ * {@link Convert#to(String) Convert#to("string")}.
+ * NOTE: Requires MongoDB 4.0 or later.
+ *
+ * @author Christoph Strobl
+ * @see https://docs.mongodb.com/manual/reference/operator/aggregation/toString/
+ * @since 2.1
+ */
+ public static class ToString extends AbstractAggregationExpression {
+
+ private ToString(Object value) {
+ super(value);
+ }
+
+ /**
+ * Creates new {@link ToString} using the given value as input.
+ *
+ * @param value must not be {@literal null}.
+ * @return new instance of {@link ToString}.
+ */
+ public static ToString toString(Object value) {
+ return new ToString(value);
+ }
+
+ @Override
+ protected String getMongoMethod() {
+ return "$toString";
+ }
+ }
+}
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ConvertOperatorsUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ConvertOperatorsUnitTests.java
new file mode 100644
index 000000000..dd7febc80
--- /dev/null
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ConvertOperatorsUnitTests.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright 2018 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.data.mongodb.core.aggregation;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.bson.Document;
+import org.junit.Test;
+
+/**
+ * Unit tests for {@link ConvertOperators}.
+ *
+ * @author Christoph Strobl
+ * @currentRead Royal Assassin - Robin Hobb
+ */
+public class ConvertOperatorsUnitTests {
+
+ static final String EXPRESSION_STRING = "{ \"$molly\" : \"chandler\" }";
+ static final Document EXPRESSION_DOC = Document.parse(EXPRESSION_STRING);
+ static final AggregationExpression EXPRESSION = context -> EXPRESSION_DOC;
+
+ @Test // DATAMONGO-2048
+ public void convertToUsingStringIdentifier() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertTo("double").toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $convert: { \"input\" : \"$shrewd\", \"to\" : \"double\" } } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void convertToUsingIntIdentifier() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertTo(1).toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $convert: { \"input\" : \"$shrewd\", \"to\" : 1 } } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void convertToUsingFieldReference() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertToTypeOf("fitz").toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $convert: { \"input\" : \"$shrewd\", \"to\" : \"$fitz\" } } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void convertToUsingExpression() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertToTypeOf(EXPRESSION).toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $convert: { \"input\" : \"$shrewd\", \"to\" : " + EXPRESSION_STRING + " } } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void convertToWithOnErrorValue() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertTo("double").onErrorReturn("foo")
+ .toDocument(Aggregation.DEFAULT_CONTEXT)).isEqualTo(
+ Document.parse("{ $convert: { \"input\" : \"$shrewd\", \"to\" : \"double\", \"onError\" : \"foo\" } } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void convertToWithOnErrorValueOfField() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertTo("double").onErrorReturnValueOf("verity")
+ .toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document
+ .parse("{ $convert: { \"input\" : \"$shrewd\", \"to\" : \"double\", \"onError\" : \"$verity\" } } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void convertToWithOnErrorValueOfExpression() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertTo("double").onErrorReturnValueOf(EXPRESSION)
+ .toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $convert: { \"input\" : \"$shrewd\", \"to\" : \"double\", \"onError\" : "
+ + EXPRESSION_STRING + " } } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void convertToWithOnNullValue() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertTo("double").onNullReturn("foo")
+ .toDocument(Aggregation.DEFAULT_CONTEXT)).isEqualTo(
+ Document.parse("{ $convert: { \"input\" : \"$shrewd\", \"to\" : \"double\", \"onNull\" : \"foo\" } } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void convertToWithOnNullValueOfField() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertTo("double").onNullReturnValueOf("verity")
+ .toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document
+ .parse("{ $convert: { \"input\" : \"$shrewd\", \"to\" : \"double\", \"onNull\" : \"$verity\" } } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void convertToWithOnNullValueOfExpression() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertTo("double").onNullReturnValueOf(EXPRESSION)
+ .toDocument(Aggregation.DEFAULT_CONTEXT)).isEqualTo(Document.parse(
+ "{ $convert: { \"input\" : \"$shrewd\", \"to\" : \"double\", \"onNull\" : " + EXPRESSION_STRING + " } } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toBoolUsingFieldReference() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertToBoolean().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toBool: \"$shrewd\" } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toBoolUsingExpression() {
+
+ assertThat(ConvertOperators.valueOf(EXPRESSION).convertToBoolean().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toBool: " + EXPRESSION_STRING + " } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toDateUsingFieldReference() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertToDate().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toDate: \"$shrewd\" } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toDateUsingExpression() {
+
+ assertThat(ConvertOperators.valueOf(EXPRESSION).convertToDate().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toDate: " + EXPRESSION_STRING + " } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toDecimalUsingFieldReference() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertToDecimal().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toDecimal: \"$shrewd\" } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toDecimalUsingExpression() {
+
+ assertThat(ConvertOperators.valueOf(EXPRESSION).convertToDecimal().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toDecimal: " + EXPRESSION_STRING + " } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toDoubleUsingFieldReference() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertToDouble().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toDouble: \"$shrewd\" } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toDoubleUsingExpression() {
+
+ assertThat(ConvertOperators.valueOf(EXPRESSION).convertToDouble().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toDouble: " + EXPRESSION_STRING + " } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toIntUsingFieldReference() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertToInt().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toInt: \"$shrewd\" } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toIntUsingExpression() {
+
+ assertThat(ConvertOperators.valueOf(EXPRESSION).convertToInt().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toInt: " + EXPRESSION_STRING + " } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toLongUsingFieldReference() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertToLong().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toLong: \"$shrewd\" } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toLongUsingExpression() {
+
+ assertThat(ConvertOperators.valueOf(EXPRESSION).convertToLong().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toLong: " + EXPRESSION_STRING + " } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toObjectIdUsingFieldReference() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertToObjectId().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toObjectId: \"$shrewd\" } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toObjectIdUsingExpression() {
+
+ assertThat(ConvertOperators.valueOf(EXPRESSION).convertToObjectId().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toObjectId: " + EXPRESSION_STRING + " } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toStringUsingFieldReference() {
+
+ assertThat(ConvertOperators.valueOf("shrewd").convertToString().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toString: \"$shrewd\" } "));
+ }
+
+ @Test // DATAMONGO-2048
+ public void toStringUsingExpression() {
+
+ assertThat(ConvertOperators.valueOf(EXPRESSION).convertToString().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $toString: " + EXPRESSION_STRING + " } "));
+ }
+}
diff --git a/src/main/asciidoc/reference/mongodb.adoc b/src/main/asciidoc/reference/mongodb.adoc
index 4e1aca7b8..33b20c9e8 100644
--- a/src/main/asciidoc/reference/mongodb.adoc
+++ b/src/main/asciidoc/reference/mongodb.adoc
@@ -2099,6 +2099,7 @@ The MongoDB Aggregation Framework provides the following types of aggregation op
* Array Aggregation Operators
* Conditional Aggregation Operators
* Lookup Aggregation Operators
+* Convert Aggregation Operators
At the time of this writing, we provide support for the following Aggregation Operations in Spring Data MongoDB:
@@ -2141,6 +2142,8 @@ At the time of this writing, we provide support for the following Aggregation Op
| Type Aggregation Operators
| `type`
+| Convert Aggregation Operators
+| `convert`, `toBool`, `toDate`, `toDecimal`, `toDouble`, `toInt`, `toLong`, `toObjectId`, `toString`
|===
* The operation is mapped or added by Spring Data MongoDB.