使用 spring-data-mongodb 存储库,如何检索 Map<String, Object> 中的所有属性而不必单独命名属性?
With spring-data-mongodb repositories, how can I retrieve all properties in a Map<String, Object> without having to name the properties individually?
我正在使用 spring-data-mongodb
和 Repository 接口来查询一些集合。我必须禁用 MongoAutoConfiguration
,因为我需要能够从 MongoDB 中的两个单独的数据库查询两个单独的集合。因此,在我的 @Configuration
class 中,我手动创建了两个单独的 MongoTemplate
bean 来促进这一点,并且效果很好。
对于其中一个存储库,我有一个使用 @Query
注释和 JSON 查询字符串的方法。我想要一个模型 class 在一个变量中捕获 @Id
,并且 所有其他属性 在 Map<String, Object>
中,就像我在几个变量中看到的那样示例:
@Document(collection = "#{@collectionName}")
@Data
@NoArgsConstructor
public class DynamicModel {
@Id
private String id;
private Map<String, Object> properties;
}
但这对我不起作用,我很好奇它是否与我在创建自定义 mongo 模板并禁用 mongo 时无意中遗漏的转换器有关自动配置。请注意,我也尝试过包含 @JsonAnySetter
和 @JsonAnyGetter
,但结果是一样的,属性映射中没有存储任何内容。
作为变通方法,我可以切换到使用存储库中的 @Aggregation
方法,并使用投影阶段将所有内容放入命名的子文档映射中。如果我将该地图命名为“属性”,就像上面的代码示例一样,那么它会按预期工作。
注意:如果我可以使用文档中已经存在的地图并让 spring-data-mongodb 将所有未指定的字段放入其中,则加分!
更新:我在 @PersistenceConstructor
和添加自定义转换器实现方面取得了成功。我开始假设这两种方法是我可以实现我正在寻找的唯一方法,尽管我希望有一些默认行为。
由于没有人提到更好的方法,我将post我的解决方法作为答案。我使用 @ReadingConverter
将所有属性合并到文档中的地图中。这些文档已经有一个映射,其中包含特定于每个文档子类型的所有字段,并且每个文档都包含一个映射之外的标准字段列表。我将此阅读转换器添加到 mongo 模板的自定义转换中。现在我可以处理地图并获取所有字段。我只是希望有一种更通用的方法来做到这一点,但我想如果代码不了解文档结构,那将非常困难。
我正在使用 spring-data-mongodb
和 Repository 接口来查询一些集合。我必须禁用 MongoAutoConfiguration
,因为我需要能够从 MongoDB 中的两个单独的数据库查询两个单独的集合。因此,在我的 @Configuration
class 中,我手动创建了两个单独的 MongoTemplate
bean 来促进这一点,并且效果很好。
对于其中一个存储库,我有一个使用 @Query
注释和 JSON 查询字符串的方法。我想要一个模型 class 在一个变量中捕获 @Id
,并且 所有其他属性 在 Map<String, Object>
中,就像我在几个变量中看到的那样示例:
@Document(collection = "#{@collectionName}")
@Data
@NoArgsConstructor
public class DynamicModel {
@Id
private String id;
private Map<String, Object> properties;
}
但这对我不起作用,我很好奇它是否与我在创建自定义 mongo 模板并禁用 mongo 时无意中遗漏的转换器有关自动配置。请注意,我也尝试过包含 @JsonAnySetter
和 @JsonAnyGetter
,但结果是一样的,属性映射中没有存储任何内容。
作为变通方法,我可以切换到使用存储库中的 @Aggregation
方法,并使用投影阶段将所有内容放入命名的子文档映射中。如果我将该地图命名为“属性”,就像上面的代码示例一样,那么它会按预期工作。
注意:如果我可以使用文档中已经存在的地图并让 spring-data-mongodb 将所有未指定的字段放入其中,则加分!
更新:我在 @PersistenceConstructor
和添加自定义转换器实现方面取得了成功。我开始假设这两种方法是我可以实现我正在寻找的唯一方法,尽管我希望有一些默认行为。
由于没有人提到更好的方法,我将post我的解决方法作为答案。我使用 @ReadingConverter
将所有属性合并到文档中的地图中。这些文档已经有一个映射,其中包含特定于每个文档子类型的所有字段,并且每个文档都包含一个映射之外的标准字段列表。我将此阅读转换器添加到 mongo 模板的自定义转换中。现在我可以处理地图并获取所有字段。我只是希望有一种更通用的方法来做到这一点,但我想如果代码不了解文档结构,那将非常困难。