我试图理解Java MunGDB驱动程序使用的BSON实现(在重要的情况下,官方异步)。
但是,我完全停留在表示BSON文档的类上。我现在把注意力集中在“普通”上,忽略了像懒惰的结构这样的特性。到目前为止,我发现:
基本对象
B文件
文件
bsonObject,由basicbsonObject实现的接口,但不包括其他接口。
我还发现mongodb驱动程序默认将其结果作为文档实例返回,并且可以更改为返回bsondocument。另外,JSON类希望返回一个dbobject,它由basicdbobject扩展basicbsonObject实现。
这些课程是如何联系的?在哪种情况下应该使用哪一个?
当编写接受bson文档作为参数的代码或返回它时,我应该使用哪种类型?这实际上是我最感兴趣的问题,但上述限制似乎相互矛盾。

最佳答案

在3.0驱动程序之前,所有bson文档都表示为bsonobject的实例,bsonobject是org.bson包中的一个接口。驱动程序api(dbcollection等)进一步增加了对dbobject(bsonobject的子接口)的需求。驱动程序的大多数用户依赖basicdbobject作为实现dbobject的具体类。
此外,JSON类从JSON中解析并序列化到JSON,生成并期望DBObject的实例。
在新的3.0驱动程序CRUDAPI(MongoCollection)中,dbObject在dbCollection中扮演的角色已被拆分。
mongocollection是通用的(mongocollection)。泛型类型用于写方法(如insertone),也是查询文档集合的方法的默认文档类型,例如
void insertone(t文档)
可查找的查找()
用于表示查询结果的类默认为tdocument,但可以通过调用以下方法进行更改:
可查找的查找(classresultclass)
可聚合聚合聚合(listpipeline,classresultclass)
驱动程序作者希望尽可能少地限制这些类型,因为它们可能是预先存在的POJO类。唯一的要求是该类的编解码器已在MongoCollection的编解码器注册表中注册。有关详细信息,请参见here
对于用于表示查询过滤器、更新规范、排序条件等实体的BSON文档,驱动程序要求为此目的使用的类实现名为Bson的新接口。basicdbobject、document和bsondocument都实现了该接口,因此可以使用任意接口,也可以创建自己的自定义类型。驱动程序本身从大多数新的builder静态工厂方法返回bson的实例,如Filters类中的方法。
最后,对于返回代表管理命令结果的bson文档的helper方法(如运行一般命令),驱动程序默认返回文档实例。
如果需要在JSON和document或bsondocument之间进行转换,可以使用直接在这些类上定义的parse和tojson方法。在下面,这些依赖于3.0中引入的新jsonReader和jsonWriter类。请参阅here了解更多详细信息。
作者还没有否决现有的JSON类,但很可能会在未来的版本中。
关于使用这些类中的哪些类,我将提供以下建议:
如果从2.13升级并继续使用db/dbcollection,则必须仍然使用dbobject。这不适用于新的异步驱动程序,因为它不依赖于dbobject。
对于基于MongoCollection的新应用程序(同步或异步),请使用文档类。
如果您喜欢以简洁为代价的类型安全,请使用bsondocument。bsondocument实现map以便编译器不会允许您添加不支持的值类型,而实现map的文档将(因此可能出现运行时错误)。

关于mongodb - Java MongoDB/BSON类混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29722424/

10-09 01:05