在 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 会(因此可能会出现运行时错误)。