Java MongoDB/BSON class 混乱

Java MongoDB/BSON class confusion

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

然而,我完全坚持 classes 表示 BSON 文档。我现在专注于 "normal" 部分,暂时忽略惰性构造等功能。到目前为止,我发现:

我还发现 MongoDB 驱动程序 return 默认情况下它的结果是 Document 实例,并且可以更改为 return BsonDocument。 OTOH,JSON class 想要 return 一个由 BasicDBObject 扩展 BasicBSONObject 实现的 DBObject。

这些 class 有何关联?在什么情况下应该使用哪一个?

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

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

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

在新的3.0驱动CRUDAPI(MongoCollection)中,DBObject在DBCollection中扮演的角色被拆分了。

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

  • void insertOne(TDocument 文档)
  • FindIterable 查找()

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

  • FindIterable find(Class 结果Class)
  • AggregateIterable aggregate(List pipeline, Class 结果Class)

驱动程序作者希望对这些类型设置尽可能少的限制,因为它们可能是预先存在的 POJO classes。唯一的要求是 class 的编解码器已在 MongoCollection 的 CodecRegistry 中注册。有关详细信息,请参阅 here

对于用于表示查询过滤器、更新规范、排序标准等实体的 BSON 文档,驱动程序强加了用于此目的的 classes 实现名为 [=11 的新接口的要求=] class.

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

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

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

关于使用哪些 classes,我将提供以下建议:

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