当前位置: 首页 > 面试题库 >

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

微生昌勋
2023-03-14
问题内容

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

实体类:

@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);
}

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


问题答案:

您可能想知道,Spring或Java是否是解决您问题的正确解决方案-为什么不使用更动态的工具,例如Ruby,Python或Mongoshell?

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

如果您的目标只是存储随机数据,则基本上可以定义自己的控制器并直接使用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注释JsonAnyGetter和JsonAnySetter使您可以隐藏无模式数据容器的根,以便您可以将未知字段作为有效负载中的顶级字段发送。它们仍将嵌套存储在您的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。我如何使用spring-data-mongodb库在mongo中动态创建数据库? 我试图使用Spring-Mongodb-Data模块对Mongo数据库进行CRUD操作,通过示例和文章,我的假设是在定义MongoTemplate bean时应该在spring上下文xml中预定义databasename。 请帮帮我. 谢谢-RK

  • 今天,这是一个演示,用于显示来自CSV的数据,而无需在JavaFX 2.0中的tableView上创建自定义类。我称这个TableView为动态TableView,因为表视图自动管理列和行。 在我对tableView的可编辑性的研究中,我们必须有一个自定义类,并将其实现到tableView以显示为这个演示== 但在这种情况下,我不能这样做,因为我们不知道有多少列的例子与csv文件或。dat文件。。

  • 2)testmvc.jsp文件 所以…我知道Q1/Q1'应该匹配,Q2/Q2'也应该匹配。 1)但是,我对model.addAttribute(“”,object)中的对象感到困惑;在Q1,Q2中?addAttribute是模型属性中的正确选择? <%@taglib uri=“http://java.sun.com/jsp/jstl/core”前缀=“c”%>=>/jsp在中间丢失 这个@tagl

  • 我们已有的几件: Post 模型定义在 models.py 中,我们有 post_list views.py 和添加的模板中。 但实际上我们如何使我们的帖子出现在我们的 HTML 模板上呢? 因为那是我们所想要的: 获取一些内容 (保存在数据库中的模型) 然后在我们的模板中很漂亮的展示,对吗? 这就是 views 应该做的: 连接模型和模板。 在我们的 post_list 视图 中我们需要获取我们

  • 在我的应用程序中,我需要使用两个MongoDB数据库。我不知道如何在应用程序中添加2个MongoDB数据库。spring应用程序中的属性文件。 这是申请表。我的项目的属性文件, 但是我想为同一个项目使用另一个MongoDB数据库。如何在应用程序中添加新数据库。属性文件。

  • 我试图使用存储在MongoDB中的信息生成初始配置。我正在使用Ansible的动态库存功能。后端是一个简单的mongodb数据库。当手动运行时,它会根据Ansible的要求返回JSON中的组及其变量/子组。使用参数也返回主机及其变量,不会出现任何问题。但是,当试图访问变量时,比如Ansible playbook中的或,它会出错,并告诉我没有定义。我使用命令来运行它。我已经在这个问题上工作了几个小时