gpt4 book ai didi

java - 如何为复合类实现 MongoDB 编解码器?

转载 作者:行者123 更新时间:2023-12-02 01:24:57 26 4
gpt4 key购买 nike

我正在为现有的使用 MongoDB 及其 react 流 Java 驱动程序(在 Spring boot 项目中)编写一个数据库访问模块。一些对象以复合方式存储在数据库中,仅存储引用 ID,然后在从数据库中获取时组装对象(请参阅示例代码)。我正在使用编解码器来创建 Java 对象,但我不确定如何以复合方式进行创建。

以前的同步驱动程序使用解决方案只是逐个字段地解析从 MongoDB 返回的文档,并在需要进行数据库查找以进行组装时调用适当的服务。由于该解决方案很快变得完全难以管理,因此我决定使用 MongoDB 编解码器将文档直接解析为 Java 对象。但是,我不确定如何使用编解码器执行相同的操作,因为它们似乎不允许我连接到数据库以在对象创建时获取适当的数据,并且在创建后对这些对象进行额外的获取和手动设置似乎效率低下这并不是真正正确的方法。

MongoDB 规则集合示例:

{
"_id": {
"$oid": "5afa865b613640f83206e23e"
},
"id": "R2",
"typeId": "RT1",
"name": "example rule",
}

RuleType 集合示例:

{
"_id": {
"$oid": "5afa865c613640f83206e260"
},
"id": "RT1",
"name": "Example rule type",
}

Rule.java

public Class Rule {
private id;
private name;
private RuleType ruleType;

// Constructors, setters, getters, etc.
}

RuleType.java

public Class Rule {
private id;
private name;

// Constructors, setters, getters, etc.
}

RuleDbService.java

public class RuleDbService {
private final MongoCollection<Rule> ruleCollection;
private final ObservableSubscriber<Rule> subscriber = new ObservableSubscriber<>();

public RuleDbService(final MongoDbAdapter mongoDbAdapter) {
this.ruleCollection = mongoDbAdapter.getCollection("rules", Rule.class);
}

public Optional<Rule> findFirst() {
this.ruleCollection.find().first().subscribe(this.subscriber);
return Optional.of(this.subscriber.get())
}

RulesCodec.java

public class RulesCodec implements Codec<Rule> {

private final Codec<Document> documentCodec;

public RulesCodec() {
this.documentCodec = new DocumentCodec();
}

public RulesCodec(final Codec<Document> codec) {
this.documentCodec = codec;
}


@Override
public Rule decode(final BsonReader reader, final DecoderContext decoderContext) {
final Document document = this.documentCodec.decode(reader, decoderContext);

final Rule rule = new Rule();
rule.setId(document.getString("id"));
// rule.setType() <- How to do this? Can I call to some findById(id) function in RuleTypeDbService from here?
rule.setName(document.getString("name"));

return rule;
}

@Override
public void encode(final BsonWriter writer, final Rule value, final EncoderContext encoderContext) {
final Document document = new Document();

final String ruleId = value.getId();
final String name = value.getName();
final String typeId = (value.getType() != null) ? value.getType().getId() : null;

if (ruleId != null) {
document.put("id", ruleId);
}

if (name != null) {
document.put("name", name);
}

if (typeId != null) {
document.put("typeId", typeId);
}

this.documentCodec.encode(writer, document, encoderContext);

}

@Override
public Class<Rule> getEncoderClass() {
return Rule.class;
}
}

我希望 RuleDbService 能够通过在数据库中查找来组装包括规则类型的规则,而不是使用空字段返回它,并且我必须在编解码器解析或之后进行手动外部查找和类型设置其他一些解决方法。最好的方法是什么?

注意:遗憾的是,我无法以任何方式修改数据库或模型结构,因此我无法使用任何像 Morphia 这样的 ORM 框架,这些框架需要 MongoDb 中的唯一 id 字段在 Java 模型中表示,因此我必须对文档进行解码手动。

最佳答案

您可能会考虑使用 $lookup 进行聚合。 https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

关于java - 如何为复合类实现 MongoDB 编解码器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57592756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com