文档
概述
Scala 驱动程序包括两种针对 BSON 文档的 Scala 特定表示。遵循 Scala 集合库的约定,有不可变和可变版本的Document
类型。底层 Document
实现使用类型安全的BsonDocument 类。BSON 类在 org.mongodb.scala.bson
命名空间中可用,包括类型别名和伴随对象。这些对象对于许多用例已经足够,但对于更高级的用例,您可能需要直接使用 org.bson
命名空间中的类。
重要
重复键名
服务器对文档中重复键名的行为是未定义的。当解码具有重复键名的文档时,驱动程序将分配与重复键关联的最后一个值。存储此类文档将导致其他值丢失。
注意
Scala 的 Document
类实现了 TraversableLike[(String, BsonValue)]
,并且其通用 API 与 Map[String, BsonValue]
值的 API 相似。然而,与 Map
不同,TraversableLike
的实现支持严格的类型安全,因为值类型没有变异性。
BsonValue
是来自 org.bson
库的 BSON 类型的类型安全表示,代表特定的值类型。最常用的值类型如下
BSON 类型 | Scala 类型 |
---|---|
文档 | org.mongodb.scala.bson.Document |
数组 | 列表 |
日期 | Date 或 int (自纪元以来的毫秒数) |
布尔值 | 布尔值 |
双精度浮点数 | 双精度浮点数 |
32位整数 | 整数 |
64位整数 | 长整数 |
字符串 | 字符串 |
二进制 | 字节数组 |
ObjectId | ObjectId |
空值 | 无 |
可以更改或扩展这些映射,具体过程将在以下章节中描述。
以下章节描述了两个主要的 Document
类。
不可变文档
与Scala集合库类似,不可变类是首选类。为了方便,它被别名化为org.mongodb.scala.Document
和org.mongodb.scala.bson.Document
,同时也可通过org.mongodb.scala.bson.collection.immutable.Document
访问。
此类实例保证对每个人都是不可变的。此类集合在创建后永远不会改变。因此,您可以依赖这样一个事实,即在不同时间点重复访问相同的集合值将始终返回具有相同元素的集合。
import org.mongodb.scala.bson._ val doc1 = Document("AL" -> BsonString("Alabama")) val doc2 = doc1 + ("AK" -> BsonString("Alaska")) val doc3 = doc2 ++ Document("AR" -> BsonString("Arkansas"), "AZ" -> BsonString("Arizona"))
可变文档
要获取可变的Document
类型,您需要从org.mongodb.scala.collections.mutable.Document
显式导入。可变的Document
可以在原地更新或扩展。这意味着您可以通过副作用更改、添加或删除Document
的元素。与Scala集合类似,在处理可变类型时,您需要了解哪些代码何时更改哪些集合。
import org.mongodb.scala.bson._ import org.mongodb.scala.bson.collection.mutable.Document val doc = Document("AL" -> BsonString("Alabama")) val doc1 = doc + ("AK" -> BsonString("Alaska")) // doc not mutated but new doc created doc1 ++= Document("AR" -> BsonString("Arkansas"), "AZ" -> BsonString("Arizona")) // doc1 mutated as ++= changes in place.
隐式转换
对于许多 BsonValue
类型,它们与 Scala 类型之间有明显的直接映射。例如,一个 String
映射到 BsonString
,一个 Int
映射到 BsonInt32
,一个 Long
映射到 BsonInt64
。为了方便,这些类型可以直接与 Document
类型一起使用,并且由 BsonMagnets
对象中的合同特质进行转换。只要作用域内存在任何给定类型的隐式 BsonTransformer
,则该类型就可以转换为 BsonValue
。
以下 BsonTransformers
是默认作用域的
Scala 类型 | BsonValue |
---|---|
布尔值 | BsonBoolean |
字符串 | BsonString |
字节数组 | BsonBinary |
Regex | BsonRegex |
日期 | BsonDateTime |
ObjectId | BsonObjectId |
Int | BsonInt32 |
长整数 | BsonInt64 |
双精度浮点数 | BsonDouble |
不可变.Document | BsonDocument |
可变.Document | BsonDocument |
Option[T] | BsonValue 其中 T 有一个 BsonTransformer |
Seq[(String, T)] | BsonDocument 其中 T 有一个 BsonTransformer |
Seq[T] | BsonArray 其中 T 有一个 BsonTransformer |
BsonValue | BsonValue |
import org.mongodb.scala.Document val doc1 = Document("AL" -> "Alabama") val doc2 = doc1 + ("AK" -> "Alaska") val doc3 = doc2 ++ Document("AR" -> "Arkansas", "population" -> 2.966)
这是通过使用 磁铁模式 实现的,你可以在 spray.io 的博客文章中了解更多信息: spray.io 上的磁铁模式博客文章。
在API中,我们通常期望得到单个值、键值对或多个键值对,例如 BsonValue
(String
, BsonValue
)或 Iterable[(String, BsonValue)]
,我们需要通过CanBeX
特性来处理这些类型所需的隐式转换,以符合正确的类型。这些特性包括CanBeBsonValue
、CanBeBsonElement
和CanBeBsonElements
。
一个例子是将键值对添加到Document
或值列表中。
val doc1 = Document("AL" -> "Alabama") val doc2 = Document("codes" -> List("AL", "AK", "AR"))
Bson
驱动程序还包含一个名为Bson
的小巧而强大的接口。任何表示BSON文档的类,无论是否包含在驱动程序中或来自第三方,都可以实现此接口,并可以在需要BSON文档的任何高级API位置使用。例如
collection.find(Document("x" -> 1)) collection.find(Filters.eq("x", 1))