MongoDB Java驱动程序:将BsonDocument转换为Document并返回

时间:2018-03-13 18:01:47

标签: java mongodb mongodb-java

我正在使用项目的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 。这有可能吗?

提前致谢!

3 个答案:

答案 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());