diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java index bcb9575b9..86be47c55 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java @@ -744,6 +744,9 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App Object value = accessor.getProperty(prop); if (value == null) { + if(!prop.isPropertyOmittableOnNull()) { + writeSimpleInternal(value, bson , prop); + } continue; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentProperty.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentProperty.java index 53af00fc5..3973f802a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentProperty.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentProperty.java @@ -285,4 +285,18 @@ public class BasicMongoPersistentProperty extends AnnotationBasedPersistentPrope public boolean isTextScoreProperty() { return isAnnotationPresent(TextScore.class); } + + /* + * (non-Javadoc) + * @see org.springframework.data.mongodb.core.mapping.MongoPersistentProperty#isPropertyOmittableOnNull() + */ + public boolean isPropertyOmittableOnNull() { + org.springframework.data.mongodb.core.mapping.Field annotation = findAnnotation( + org.springframework.data.mongodb.core.mapping.Field.class); + + if ( annotation != null && annotation.write().equals(Field.Write.ALWAYS) ) { + return false; + } + return true; + } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/Field.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/Field.java index 45e8b815f..b2365f8d6 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/Field.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/Field.java @@ -34,6 +34,21 @@ import org.springframework.core.annotation.AliasFor; @Target({ ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE }) public @interface Field { + /** + * Enumeration of write strategies for a field with null value.It decides whether a field with null value has to be + * written to the resulting document to be saved to the database. + */ + enum Write{ + /* + * The field will always be written to the database irrespective of null value. + */ + ALWAYS, + /* + * The field will only be written to the database if it has a non null value. + */ + NON_NULL + } + /** * The key to be used to store the field inside the document. Alias for {@link #name()}. * @@ -65,4 +80,14 @@ public @interface Field { * @since 2.2 */ FieldType targetType() default FieldType.IMPLICIT; + + /** + * If set to {@link Write#NON_NULL} {@literal null} values will be omitted. + * Setting the value to {@link Write#ALWAYS} explicitly adds an entry for the given field + * holding {@literal null} as a value {@code 'fieldName' : null }. + *
+ * NOTE Setting the value to {@link Write#ALWAYS} may lead to increased document size. + * @return {@link Write#NON_NULL} by default. + */ + Write write() default Write.NON_NULL; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoPersistentProperty.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoPersistentProperty.java index c753f3856..10f35435d 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoPersistentProperty.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoPersistentProperty.java @@ -104,6 +104,24 @@ public interface MongoPersistentProperty extends PersistentProperty