【问题标题】:Spring Data Mongo doesn't persist field value as null - This doesn't worksSpring Data Mongo 不会将字段值保留为 null - 这不起作用
【发布时间】:2019-04-09 16:05:54
【问题描述】:

我已经浏览了链接:https://jira.spring.io/browse/DATAMONGO-1107,而且我没有看到在 application.properties 文件中设置 spring.data.mongodb.persist-null-fields=true 的选项。

Spring Data Mongo 甚至不会持久化值为 null 的字段。如果我愿意,如何允许保存空值?

Person.java

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document
public class Person {
    private String id;
    private String firstName;
    private String lastName;
    private String emailId;
    @Field
    private List<Hobbies> hobbies;
}

爱好.java

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Hobbies {
    private String interest;
    private String sports;
}

save() - 此方法不保存数据。

private void savePersons() {
        Hobbies hobbies1 = Hobbies.builder().interest("Indoor").sports("Chess").build();
        Hobbies hobbies2 = Hobbies.builder().interest("Loveoor").sports("Table Tennis").build();
        Hobbies hobbies3 = Hobbies.builder().interest("Gamedoor").sports("Cricket").build();
        Hobbies hobbies4 = Hobbies.builder().interest("Happydoor").sports("Lawn Tennis").build();


        Person john = Person.builder().firstName("John")
                .emailId("john.kerr@gmail.com").hobbies(Arrays.asList(hobbies1, hobbies2)).build();

        Person neha = Person.builder().firstName("Neha").lastName("Parate")
                .emailId("john.kerr@gmail.com").hobbies(Arrays.asList(hobbies1, hobbies2, hobbies4)).build();

        repository.saveAll(Arrays.asList(john, neha));
    }

我没有看到文件中保存了 lastName。 另外,如何将 Date 保存为空值?

【问题讨论】:

  • @Triet Doan - 我已经检查过该解决方案。如果我们可以使用 Spring Data Mongo 而不是 BSONObject,有什么办法吗?
  • 我不确定。您可以尝试用@JsonInclude(JsonInclude.Include.ALWAYS) 注释您的Person 课程吗?注释来自 Jackson 库。
  • @Triet Doan - 仍然无法正常工作。我想知道为什么看不到将 null 保存到 MongoDB 中的规定?
  • 您能否分享一下为什么需要在 MongoDB 中存储 null 的原因?通常,我认为这样做没有意义。但也许我错了。

标签: spring mongodb spring-data-mongodb


【解决方案1】:

一种解决方案可能是使用defaults

您的架构可以为某些路径定义默认值。如果您在未设置该路径的情况下创建新文档,则默认设置将生效。

因此,如果您想“允许 null”,只需通过添加到您的架构定义 lastName: { type: String, default: null } 使其成为默认值。当没有 lastName(又名 null)时,您将获得默认值(null)。
我会重新考虑允许null,因为它会使查询变得复杂:Query on key: null 将检索所有文档,其中 key 为 null 或 key 不存在

【讨论】:

  • 谢谢!您能否从 Spring Data Mongo 的角度发布答案?我需要做哪些改变?
  • 我为 Spring Data Mongo 添加了一个示例。我对框架不是很熟悉,这个private String field = null;可以吗?
  • 我确实喜欢@Field private String lastName = null;,但仍然无法正常工作
  • @Field private String lastName = ''; 空字符串会得到什么?
  • 即使我设置@Field private String lastName = "David"; 我也没有得到默认值。在这种情况下,我正在保存这样的文档:Person john = Person.builder().firstName("John") .emailId("john.kerr@gmail.com").hobbies(Arrays.asList(hobbies1, hobbies2)).build();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 2018-07-06
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
相关资源
最近更新 更多