在3.0驱动程序之前,所有BSON文档都表示为BSONObject的实例,BSONObject是组织中的一个接口.bson软件包.驱动程序API(DBCollection等)进一步对BSONObject的子接口DBObject施加了必要的限制.驱动程序的大多数用户依赖BasicDBObject作为实现DBObject的具体类.
此外,从JSON解析并序列化为JSON的JSON类生成并期望DBObject的实例.
在新的3.0驱动程序CRUD API(MongoCollection)中,DBObject在DBCollection中扮演的角色已被拆分.
MongoCollection is generic (MongoCollection<TDocument>). The generic type is used for write methods like insertOne, and is also the default document type for methods that query the collection for documents, e.g
- void insertOne(t文件文件)
- findItemable find()
用于表示查询结果的类默认为TDocument,但可以通过调用以下方法进行更改:
- FindIterable find(Class<TResult> resultClass)
- AggregateIterable aggregate(List<? extends Bson> pipeline, Class<TResult> resultClass)
驱动程序作者希望对这些类型施加尽可能少的限制,因为它们可能是预先存在的POJO类.唯一的要求是该类的编解码器已在MongoCollection的编解码器注册表中注册.详情见here.
对于用于表示查询过滤器、更新规范、排序条件等实体的BSON文档,驱动程序要求用于此目的的类实现一个名为Bson的新接口.BasicDBObject、Document和BsonDocument都实现了该接口,因此可以使用任何接口,也可以创建自己的自定义类型.驱动程序本身从大多数新的构建器静态工厂方法(如Filters类中的方法)返回Bson实例.
最后,对于返回代表管理命令结果的BSON文档(如运行通用命令)的帮助器方法,驱动程序默认返回文档实例.
如果需要在JSON和Document或BsonDocument之间进行转换,可以使用直接在这些类上定义的parse和toJson方法.在底层,它们依赖于3.0中引入的新JsonReader和JsonWriter类.更多细节见here.
作者尚未弃用现有的JSON类,但很可能会在future 的版本中弃用.
关于使用哪一类,我将提供以下建议:
- 如果从2.13升级并继续使用DB/DBCollection,则必须仍然使用DBObject.这不适用于新的异步驱动程序,它不依赖于DBObject.
- 对于基于MongoCollection的新应用程序(同步或异步),请使用Document类.
- If you prefer type safety at the expense of brevity, use BsonDocument. BsonDocument implements Map<String, BsonValue> so the compiler will not let you add an unsupported value type, whereas Document, which implements Map<String, Object>, will (so runtime errors are possible).