【问题标题】:Java MongoDB/BSON class confusionJava MongoDB/BSON 类混淆
【发布时间】:2015-06-25 16:12:50
【问题描述】:

我正在尝试了解 Java MongoDB 驱动程序使用的 BSON 实现(官方异步驱动程序,以防这很重要)。

但是,我完全停留在代表 BSON 文档的类上。我专注于“正常”的那些,暂时忽略诸如惰性构造之类的功能。到目前为止,我发现:

  • 基本BSON对象
  • BsonDocument
  • 文档
  • BSONObject,BasicBSONObject 实现的接口,其他接口没有实现

我还发现 MongoDB 驱动程序默认将其结果作为 Document 实例返回,并且可以更改为返回 BsonDocument。 OTOH,JSON类要返回一个DBObject,由BasicDBObject扩展BasicBSONObject实现。

这些类有什么关系?在什么情况下应该使用哪一个?

在编写接受或返回 BSON 文档作为参数的代码时,我应该使用哪种类型?这其实是我最感兴趣的问题,但是上面的限制似乎是矛盾的。

【问题讨论】:

    标签: mongodb bson


    【解决方案1】:

    在 3.0 驱动程序之前,所有 BSON 文档都表示为 BSONObject 的实例,这是 org.bson 包中的一个接口。驱动 API(DBCollection 等)进一步强加了 DBObject 的要求,DBObject 是 BSONObject 的子接口。该驱动程序的大多数用户都依赖 BasicDBObject 作为实现 DBObject 的具体类。

    此外,从 JSON 解析并序列化为 JSON 的 JSON 类生成并期望 DBObject 的实例。

    在新的 3.0 驱动程序 CRUD API (MongoCollection) 中,DBObject 在 DBCollection 中所扮演的角色已经被拆分。

    MongoCollection 是通用的 (MongoCollection)。泛型类型用于 insertOne 等写入方法,也是查询文档集合的方法的默认文档类型,例如

    • void insertOne(TDocument 文档)
    • FindIterable find()

    用于表示查询结果的类默认为TDocument,但可以通过调用如下方法改变:

    • FindIterable find(Class resultClass)
    • AggregateIterable 聚合(List extends Bson> 管道,Class resultClass)

    驱动程序作者希望对这些类型施加尽可能少的限制,因为它们可能是预先存在的 POJO 类。唯一的要求是该类的编解码器已在 MongoCollection 的 CodecRegistry 中注册。详情请见here

    对于用于表示查询过滤器、更新规范、排序标准等实体的 BSON 文档,驱动程序要求用于此目的的类实现一个名为 Bson 的新接口。 BasicDBObject、Document 和 BsonDocument 都实现了该接口,因此可以使用任何接口,或者您可以创建自己的自定义类型。驱动程序本身从大多数新的构建器静态工厂方法返回 Bson 实例,例如 Filters 类中的那些。

    最后,对于返回代表管理命令结果的 BSON 文档的辅助方法(例如运行通用命令),驱动程序默认返回 Document 的实例。

    如果您需要在 JSON 和 Document 或 BsonDocument 之间进行转换,您可以使用直接在这些类上定义的 parse 和 toJson 方法。下面,这些依赖于 3.0 中引入的新 JsonReader 和 JsonWriter 类。详情请见here

    作者尚未弃用现有的 JSON 类,但很可能会在未来的版本中弃用。

    关于使用这些类中的哪一个,我将提供以下建议:

    • 如果从 2.13 升级并继续使用 DB/DBCollection,则仍必须使用 DBObject。这不适用于新的异步驱动程序,它不依赖于 DBObject。
    • 对于基于 MongoCollection 的新应用程序(同步或异步),请使用 Document 类。
    • 如果您更喜欢类型安全而牺牲简洁性,请使用 BsonDocument。 BsonDocument 实现 Map 因此编译器不会让您添加不受支持的值类型,而实现 Map 的 Document 会(因此可能会出现运行时错误)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      • 2023-03-03
      • 2013-08-19
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多