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

然而,我完全被代表BSON文档的类卡住了.我把注意力集中在"正常"的功能上,暂时忽略了懒惰构造之类的功能.到目前为止,我发现:

  • 基本对象
  • B有声文件
  • 文件
  • BSONObject, an interface implemented by 基本对象 but not the others

我还发现,默认情况下,MongoDB驱动程序将其结果作为文档实例返回,并且可以更改为返回B有声文件.JSON类希望返回一个DBObject,它由BasicDBObject扩展BasicBobObject实现.

这些课程有什么关系?哪种情况下应该使用哪一种?

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

推荐答案

在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).

Mongodb相关问答推荐

MongoDB.ArrayFilters出错:在路径中找不到标识符';elem';的数组筛选器

在单个mongo文档中组合数组与聚合

发布到 MongoDB 时生成的附加id字段

如何在查找 foreignField 中使用通配符?

根据条件删除一些数组元素并将数组的大小更新为mongo中的另一个文件

$group 和 sum + 添加所有大于

在 mongodb 聚合中的阶段之后输出具有序列数字 id 的新集合

Mongodb 仅在值唯一时插入,否则更新 - 在 node.js 中

mongoose如何在幕后工作

MongoDB展开多个数组

使用已排序的数据获取不同的值

mongoose得到`TypeError: user.save is not a function` - 出了什么问题

MongoDb 数据库与集合

用于嵌入式集合的 MongoDB 首选模式.文档与数组

C# MongoDB 驱动程序 - 如何使用 UpdateDefinitionBuilder?

Java + MongoDB:更新文档中的多个字段

使用自定义 _id 值时 mongodb 中的 Upserts

如何通过mongoose更新 mongodb 中的对象?

何时使用Singleton单例、Transient和使用 Ninject 和 MongoDB 的请求

哪个数据库适合我的应用程序 mysql 或 mongodb ?使用 Node.js 、 Backbone 、 Now.js