我正在使用项目的MongoDB Java驱动程序从Java访问我的数据库。
我通常使用Document
,因为它非常易于使用,MongoDBCollection
中的所有方法(例如find()
都可以使用它并返回Document
个实例。
但是,在某些情况下,我想使用更详细的等效BsonDocument
,但通过实现Map<String,BsonValue>
提供类型安全性,Document
没有,因为它实现了{{} 1}}。
我可以将 Map<String,Object>
转换为Document
:
BsonDocument
这里的问题是BsonDocument bsonDoc = document.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry());
中的所有方法,例如MongoDBCollection
只接受insertOne()
个实例,因此我无法使用这些方法。
对我来说,看起来有两种方法可以解决这个问题:
如果Document
创建的BsonDocument
以某种方式由原始toBsonDocument()
支持,即使我对Document
进行了修改,我也可以使用原始Document
实例{1}},因为原始BsonDocument
会反映这些变化,对吗?
它是以这种方式工作还是Document
只是副本?
第二种方法是将 BsonDocument
转换回BsonDocument
。这有可能吗?
提前致谢!
答案 0 :(得分:3)
假设您有一个CodecRegistry
的实例,则可以使用此适配器将BsonDocument
转换为Document
,反之亦然:
public class DocumentAdapter {
private final CodecRegistry registry;
private final Codec<Document> codec;
public DocumentAdapter(CodecRegistry registry) {
this.registry = registry;
this.codec = registry.get(Document.class);
}
public Document fromBson(BsonDocument bson) {
return codec.decode(bson.asBsonReader(), DecoderContext.builder().build());
}
public BsonDocument toBson(Document document) {
return document.toBsonDocument(BsonDocument.class, registry);
}
}
答案 1 :(得分:1)
public static Document bsonToDocument(BsonDocument bsonDocument) {
DocumentCodec codec = new DocumentCodec();
DecoderContext decoderContext = DecoderContext.builder().build();
return codec.decode(new BsonDocumentReader(bsonDocument), decoderContext);
}
答案 2 :(得分:0)
我使用这种“变通方法”将BsonDocument
转换为字符串,然后将字符串转换为Document
。
视情况而定。
final BsonDocument json = BsonDocument.parse("{}");
final Document parsedJson = Document.parse(json.toJson());
或者简单地
final Document json = Document.parse(BsonDocument.parse("{}").toJson());