gpt4 book ai didi

spring-data-mongodb - 如何在MongoDB中的Spring数据中使用动态模式?

转载 作者:行者123 更新时间:2023-12-04 06:56:51 30 4
gpt4 key购买 nike

Mongodb是一个无模式文档数据库,但是在 Spring 数据中,有必要定义实体类和存储库类,如下所示:

实体类:

@Document(collection = "users")
public class User implements UserDetails {
@Id private String userId;
@NotNull @Indexed(unique = true) private String username;
@NotNull private String password;
@NotNull private String name;
@NotNull private String email;
}

存储库类:
public interface UserRepository extends MongoRepository<User, String> {
User findByUsername(String username);
}

无论如何,在 Spring 数据mongodb中是否有使用map not class的功能,以便服务器可以接受任何动态JSON数据,然后将其存储在BSON中而无需任何预定义类?

最佳答案

首先,关于无模式数据的一些有见地的链接:

  • what does “schemaless” even mean anyway?
  • “schemaless” doesn't mean “schemafree

  • 其次...也许您会怀疑Spring或Java是否是解决您问题的正确解决方案-为什么不使用像Ruby,Python或Mongoshell这样的更具动态性的工具呢?

    话虽这么说,让我们专注于技术问题。

    如果您的目标只是存储随机数据,则基本上可以定义自己的 Controller 并直接使用MongoDB Java驱动程序。

    如果您确实坚持为域对象类没有预定义的架构,请使用以下命令:
    @Document(collection = "users")
    public class User implements UserDetails {
    @Id
    private String id;
    private Map<String, Object> schemalessData;

    // getters/setters omitted
    }

    基本上,它为您提供了一个容器,您可以在其中放入所需的任何内容,但要注意序列化/反序列化问题(如果嵌套文档中有ObjectId和DBRef,则可能会很棘手)。另外,如果您的数据层次结构变得过于复杂,则更新数据可能会变得令人讨厌。

    仍然,在某个时候,您将意识到您的数据确实具有可以精确定位并放入定义明确的POJO中的模式。

    更新

    由于人们仍然碰巧在2020年仍会阅读此帖子,所以最新的更新是:Jackson批注 JsonAnyGetterJsonAnySetter可让您隐藏无模式数据容器的根,以便您可以将未知字段作为有效负载中的顶级字段发送。它们仍将嵌套存储在您的MongoDB文档中,但是当通过Spring请求资源时,它们将显示为顶级字段。
    @Document(collection = "users")
    public class User implements UserDetails {
    @Id
    private String id;

    // add all other expected fields (getters/setters omitted)
    private String foo;
    private String bar;

    // a container for all unexpected fields
    private Map<String, Object> schemalessData;

    @JsonAnySetter
    public void add(String key, Object value) {
    if (null == schemalessData) {
    schemalessData = new HashMap<>();
    }
    schemalessData.put(key, value);
    }

    @JsonAnyGetter
    public Map<String, Object> get() {
    return schemalessData;
    }

    // getters/setters omitted
    }

    关于spring-data-mongodb - 如何在MongoDB中的Spring数据中使用动态模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35847165/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com