Java MongoDB/BSON类混淆

Mar*_*sse 15 mongodb bson

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

但是,我完全坚持代表BSON文档的类.我专注于"正常"的,暂时忽略了懒惰结构等功能.到目前为止,我发现:

  • BasicBSONObject
  • BsonDocument
  • 文献
  • BSONObject,由BasicBSONObject实现的接口,但不是其他接口

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

这些课程如何相关?在哪种情况下应该使用哪一个?

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

jye*_*min 34

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

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

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

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

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

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

  • FindIterable find(Class <TResult> resultClass)
  • AggregateIterable聚合(List <?extends Bson> pipeline,Class <TResult> resultClass)

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

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

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

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

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

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

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