当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Data MongoDB中保存和查询动态字段?

胡国兴
2023-03-14

我使用的是Spring boot 1.4.x分支和Spring Data MongoDB。

{
   "id":"12334234234",
   "dynamicField1": "dynamicValue1",
   "dynamicField2": "dynamicValue2"
}
@Document
public class Entry extends HashMap<String, Object> {

    @Id
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}
public interface EntryRepository extends MongoRepository<Entry, String> {
}

当我启动应用程序时,我会出现以下错误:

Error creating bean with name 'entryRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.model.MappingException: Could not lookup mapping metadata for domain class java.util.HashMap!

你知道吗?

共有1个答案

周朗
2023-03-14
  1. 不要将Java Collection/Map类型用作实体的基类。
  2. 存储库不适合您的需求。
  3. 如果需要动态顶级属性,请将DBObjectMongoTemplate一起使用。

Spring数据存储库是DDD意义上的存储库,充当定义良好的聚合的持久性网关。它们检查域类以派生适当的查询。Spring数据将集合和映射类型排除在实体分析之外,这就是从map扩展实体失败的原因。

动态属性的存储库查询方法是可能的,但这不是主要的用例。您必须使用SpEL查询来表示您的查询:

public interface EntryRepository extends MongoRepository<Entry, String> {

    @Query("{ ?0 : ?1 }")
    Entry findByDynamicField(String field, Object value);
}
List<DBObject> result = template.find(new Query(Criteria.where("your_dynamic_field")
                                          .is(theQueryValue)), DBObject.class);

dbobject是一个映射,它使您能够完全访问属性,而无需强制执行预定义的结构。您可以通过模板API创建、读取、更新和删除dbobject的对象。

如果聚合根声明了一些静态属性,则可以使用映射在嵌套级别上声明动态属性:

@Document
public class Data {

    @Id
    private String id;
    private Map<String, Object> details;
}
 类似资料:
  • 问题内容: 假设我有一个存储在这样的变量中的查询(它实际上是动态填充的,并且更复杂,但这是出于演示目的): 有没有一种方法可以检查查询是否返回任何结果?像这样的东西,但这是行不通的: 我能想到的唯一方法是将结果放入临时表中,然后从中进行查询,但这并不理想,因为动态查询中的列可以变化,而且我真的不需要临时表除了检查是否会返回某些行外,完全出于其他原因。有没有更好的办法? 问题答案: 尝试执行和用于查

  • 问题内容: 我想遍历一个表列表。对于每个表,我想运行一个更新查询。 伪代码: 问题答案: 感谢Harpo的回答。我已经使用该想法来构建以下sql语句。我们有许多表50+,它们都具有相同的数据类型(员工ID),但字段名称可能不同。因此,根据表名称,要更新的字段将有所不同。我实际的WHERE和SET语句比本示例要复杂得多,但这对这个问题并不重要。 我首先创建一个临时表来存储要更新的表/字段。 然后,我

  • 问题内容: 我有PostgreSQL数据库,我尝试打印所有用户(人)。 当我执行此查询时 我得到所有车主按汽车数量排序 输出: 当我尝试链接所有者ID时,所有订单都出错了。 输出:和其他数据 你看比命令是错误的。所以这是我的问题,我该如何保存该订单? 问题答案: 解开混乱。先汇总,然后再加入: 无需加入两次。如果您计数 最多或所有行, 这应该是最快的。 对于 较小的选择 , 相关子查询 更快: 至

  • 是否可以从数据库中获取一个查询,该查询将从给定的变量(即将其发送到HTML,如下所示: 假设查询返回3个对象。这意味着该表将有3行数据,但所有的

  • 我有4个按钮来替换活动中的片段[片段A,片段B,片段C,片段D],然后我将片段A替换为活动,然后我将片段A中的值更改为片段A,之后我将片段B替换为片段A,并将片段C替换为片段B.但是我想把片段A替换成片段C。如何在片段A中保存状态。 当我提交片段时编写代码 要替换的图表 片段A ------- 片段B ------- 片段C ------- PS.我不想使用返回按钮返回片段A,我想替换片段A并在第

  • 每个人。在mongo组查询中,结果仅显示参数中的键。如何像mysql查询组一样保留每个组中的第一个文档。例如: 结果: 如何获取以下内容: