【发布时间】:2021-01-25 12:49:56
【问题描述】:
我将 MongoDb 用于非结构化文档。当我进行聚合时,我将最终输出作为非结构化对象。为了方便起见,我发布了一些示例数据。实际对象有很多字段。 例如:
[
{ _id : "1", type: "VIDEO", videoUrl : "youtube.com/java"},
{ _id : "2", type: "DOCUMENT", documentUrl : "someurl.com/spring-boot-pdf"},
{ _id : "3", type: "ASSESSMENT", marks : 78}
]
上述对象类型对应的类是
@Data
public class Video{
private String _id;
private String type;
private String videoUrl;
}
@Data
public class Document{
private String _id;
private String type;
private String documentUrl;
}
@Data
public class Assessment{
private String _id;
private String type;
private Integer marks;
}
由于我无法指定转换器类,我将所有对象作为Object.class 的列表,这是所有对象的通用类型。
List<Object> list = mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(YOUR_COLLECTION.class), Object.class).getMappedResults();
它正在工作,但是对于后端和前端开发人员来说这是不可读且不可维护的(例如:swagger ui)。所以我想出了一个解决方案,将所有字段都归为一个类。
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
class MyConvetor{
private String _id;
private String type;
private String videoUrl;
private String documentUrl;
private Integer marks;
}
这里Jackson 有助于忽略所有空字段
现在我可以使用MyConverter 作为类型
List<MyConverter> list = mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(YOUR_COLLECTION.class), MyConverter.class).getMappedResults();
但是当我们实现标准应用程序时,我觉得这不是一个好的做法。我想知道,有没有办法避免通用类型类(例如扩展任何抽象类)?或者这是我唯一能做的?
【问题讨论】:
-
您的数据已经被标记为非结构化,在我看来,这是一个问题,比发送给您的客户的一般数据类型更严重。此外,我认为您的客户正在获得正确指定的数据结构,尤其是。
type字段确定内容类型。您可以将@JsonInclude(JsonInclude.Include.NON_NULL)视为序列化机制,即使它确实在上下文或需求中引入了代码异味。不过,您可能会更改的一件事是使videoUrl、documentUrl和marks成为组合类型的一部分,在videoDetails等字段中。 -
@ernest_k 这是有道理的。但我只是为了方便而发布了一个示例字段。那是我的错误,还没有包括在内。我的每个班级都有20多个领域。所以我不能做组合字段,不是吗?这就是问题
标签: java spring-boot spring-data spring-data-mongodb