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

use*_*762 8 spring-data-mongodb

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;
}
Run Code Online (Sandbox Code Playgroud)

存储库类:

public interface UserRepository extends MongoRepository<User, String> {
    User findByUsername(String username);
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*rin 10

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

第二......人们可能想知道Spring或Java是否是解决问题的正确方法 - 为什么不是一个更动态的工具,如Ruby,Python或Mongoshell?

话虽如此,让我们关注技术问题.

如果你的目标只是存储随机数据,你基本上只需要定义自己的控制器并直接使用MongoDB Java驱动程序.

如果您真的坚持没有为您的域对象类预定义的架构,您可以使用如下内容:

@Document(collection = "users")
public class User implements UserDetails {
    @Id
    private String id;
    private Object data;

    // getters/setters omitted
}
Run Code Online (Sandbox Code Playgroud)

数据也可以定义为Map,com.mongodb.DBObject,com.mongodb.BasicDBObject或com.mongodb.BasicDBList.

基本上,它可以让你在其中的字段,你可以把任何你想要的,但要注意的序列化/反序列化的问题(如果你的嵌套文档中了的ObjectID和这DBREFS可能成为棘手).此外,如果您的数据层次结构变得过于复杂,更新数据可能会变得很糟糕.

不过,在某些时候,您会发现您的数据确实具有可以精确定位并存入定义明确的POJO的模式.