【问题标题】:MongoDB Java Driver: Convert BsonDocument to Document and backMongoDB Java 驱动程序:将 BsonDocument 转换为 Document 并返回
【发布时间】:2018-03-13 18:01:47
【问题描述】:

我正在为我的项目使用 MongoDB Java 驱动程序来从 Java 访问我的数据库。

我通常使用Document,因为它非常易于使用,并且MongoDBCollection 中的所有方法,例如find() 都可以使用它并返回Document 实例。

但是,在某些情况下,我想使用等效的 BsonDocument,它更详细,但通过实现 Map<String,BsonValue> 提供类型安全,而 Document 没有,因为它实现了 Map<String,Object>

我可以通过以下方式将 Document 转换为 BsonDocument

BsonDocument bsonDoc = document.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry());

这里的问题是,MongoDBCollection 中的所有方法,比如insertOne() 只接受Document 实例,所以我不能使用这些。


对我来说,似乎有两种方法可以解决这个问题:

如果toBsonDocument() 创建的BsonDocument 在某种程度上得到原始Document 的支持,即使我对BsonDocument 进行了修改,我也可以使用原始Document 实例,因为原始@987654341 @ 会反映这些变化,对吧? 它是这样工作的还是BsonDocument 只是一个副本?

第二种方法是从 BsonDocument 转换回 Document。这在某种程度上可能吗?


提前致谢!

【问题讨论】:

  • 你在使用任何 ORM 吗?如果没有请查看Morphia:mongodb.github.io/morphia,不需要从BsonDocument来回切换
  • 您是否尝试过将 BsonDocument 传递给 insertOne() ?它应该可以工作。
  • @dkb 谢谢!我会调查的!也许这会让整个事情变得更容易。
  • @Veeram 根据您的评论,我发现还有另一个getCollection 可以用来获取集合实例中的其他类型的文档。我会调查一下,看看我能不能让它工作!

标签: java mongodb mongodb-java


【解决方案1】:

假设您有一个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);
    }
}

【讨论】:

  • 这很棒。我在 DocumentCodec 上达到了顶峰,看起来 decode() 也是线程安全的!
【解决方案2】:
public static Document bsonToDocument(BsonDocument bsonDocument) {
    DocumentCodec codec = new DocumentCodec();
    DecoderContext decoderContext = DecoderContext.builder().build();
    return codec.decode(new BsonDocumentReader(bsonDocument), decoderContext);
}

【讨论】:

    【解决方案3】:

    我使用这种“解决方法”将BsonDocument 转换为字符串,然后将字符串转换为Document
    根据场景可能会有用。

    final BsonDocument json = BsonDocument.parse("{}");
    final Document parsedJson = Document.parse(json.toJson());
    

    或者干脆

    final Document json = Document.parse(BsonDocument.parse("{}").toJson());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      相关资源
      最近更新 更多