mongodb - Java MongoDB/BSON 类混淆

标签 mongodb bson

我正在尝试了解 Java MongoDB 驱动程序使用的 BSON 实现(官方异步驱动程序,以防这很重要)。

但是,我完全停留在代表 BSON 文档的类上。我专注于“正常”的那些,暂时忽略诸如惰性构造之类的功能。到目前为止,我发现:

  • 基本 BSON 对象
  • BsonDocument
  • 文档
  • BSONObject,BasicBSONObject 实现的接口(interface),其他接口(interface)没有实现

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

这些类有什么关系?在什么情况下应该使用哪一个?

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

最佳答案

在 3.0 驱动程序之前,所有 BSON 文档都表示为 BSONObject 的实例,这是 org.bson 包中的一个接口(interface)。驱动 API(DBCollection 等)进一步强加了 DBObject 的要求,DBObject 是 BSONObject 的子接口(interface)。该驱动程序的大多数用户都依赖 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 pipeline, Class resultClass)

驱动程序作者希望对这些类型施加尽可能少的限制,因为它们可能是预先存在的 POJO 类。唯一的要求是该类的编解码器已在 MongoCollection 的 CodecRegistry 中注册。见 here了解详情。

对于用于表示查询过滤器、更新规范、排序标准等实体的 BSON 文档,驱动程序要求用于此目的的类实现称为 Bson 的新接口(interface)。 . BasicDBObject、Document 和 BsonDocument 都实现了该接口(interface),因此可以使用任何接口(interface),或者您可以创建自己的自定义类型。驱动程序本身从大多数新的构建器静态工厂方法返回 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 会(因此可能会出现运行时错误)。

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

相关文章:

node.js - 无法连接到数据库MongoParseError : Unescaped at-sign in authority section

swift - swift 的BSON?

python - MongoDB 插入速度权衡

java - MongoDB "find"查询具有多个查询文档

node.js - 我在连接 mongodb 和express 时遇到错误,我的终端疯了

javascript - 从 mongodb 游标中检索每个第 x 个元素的有效方法

mongodb - 使用golang中的过滤器从mongodb复合集合中获取所有数据

javascript - Mongoose 模型如何在不导出的情况下工作

数字的 MongoDB 内部数据类型

c - JSON 到 BSON 转换,mongodb c