SpringMongo - 发现文档结构

Posted

技术标签:

【中文标题】SpringMongo - 发现文档结构【英文标题】:SpringMongo - discover document structure 【发布时间】:2016-08-22 19:11:01 【问题描述】:

我有一个客户的数据库,其中包含一个集合,其中的文档字段可以彼此不同。我可以依赖一些常量字段,但至于其余部分 - 我无法缩小字段列表,因为客户希望解决方案是动态的。 我的问题是——我能否以某种方式实现一个通用映射,比如使用 Spring Data 返回文档字段的映射?

编辑:

感谢您的提示。我尝试使用实体获取通用对象(希望能够将其转换为地图):

@Document(collection = "Data")
public class DataEntity 

    @Id
    private String id;

    private Object data;

    public Object getData() 
        return data;
    

    public void setData(Object data) 
    this.data = data;
    

    public String getId() 
        return id;
    

    public void setId(String id) 
        this.id = id;
    


但是使用 MongoRepository 通过 ID 获取对象会生成一个数据字段设置为 null 的对象。 我正在使用 SpringBoot 1.3.1.RELEASE 和 spring-boot-starter-data-mongodb 1.3.1.RELEASE。

【问题讨论】:

查看here 以获得类似问题的答案。还讨论了一些含义here。 @Marc 谢谢,我刚刚试过了。知道为什么这对我不起作用吗?我在数据字段中得到一个空值。我已经检查过查询的条目确实有一些额外的字段。 正如@titogeo 在他的评论中提到的那样,您需要将所有“动态”字段放在数据库对象的 properties (或任何名称)字段中以获得解决方案工作。 我明白了。问题是 - 我不管理数据库结构,我的应用程序需要对第 3 方提供的数据库执行一些只读操作。哦,好吧,我会尝试破解一些东西,谢谢。 【参考方案1】:

您可以将地图用于动态属性,如下所示。这是你要找的吗?

@Document(collection = "computers")
public class Computer 

  @Id
  private String id;

  @Field("name")
  private String name;

  //Other constant fields

  @Field("properties")
  private Map<String, Object> properties;


【讨论】:

这就是我的意思 - 但我没有像“属性”这样的常量字段名称来存储所有动态字段。所有动态字段都在主文档级别。例如:"_id": ObjectId("123456789"), "name": "blablabla", "dynamic_field_1": "dynamic1", "dynamic_field_2": "dynamic2", etc... 我已经尝试过您的解决方案,但属性字段被设置为 null。 将所有动态字段作为地图。

以上是关于SpringMongo - 发现文档结构的主要内容,如果未能解决你的问题,请参考以下文章

JVM内存结构

Element学习

文档设计也需要坚持DRY原则--支付中心应用部署结构图完善

C# 结构文档:构造函数初始化器与 `ref` 和 `out` 参数的关系

PouchDB 结构

word文档的数据损坏如何进行修复