文档菜单
文档首页
/ / /
Scala
/

文档

本页内容

  • 概述
  • 不可变文档
  • 可变文档
  • 隐式转换
  • Bson

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
数组
列表
日期
Dateint(自纪元以来的毫秒数)
布尔值
布尔值
双精度浮点数
双精度浮点数
32位整数
整数
64位整数
长整数
字符串
字符串
二进制
字节数组
ObjectId
ObjectId
空值

可以更改或扩展这些映射,具体过程将在以下章节中描述。

以下章节描述了两个主要的 Document 类。

与Scala集合库类似,不可变类是首选类。为了方便,它被别名化为org.mongodb.scala.Documentorg.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中,我们通常期望得到单个值、键值对或多个键值对,例如 BsonValueString, BsonValue)或 Iterable[(String, BsonValue)],我们需要通过CanBeX特性来处理这些类型所需的隐式转换,以符合正确的类型。这些特性包括CanBeBsonValueCanBeBsonElementCanBeBsonElements

一个例子是将键值对添加到Document或值列表中。

val doc1 = Document("AL" -> "Alabama")
val doc2 = Document("codes" -> List("AL", "AK", "AR"))

驱动程序还包含一个名为Bson的小巧而强大的接口。任何表示BSON文档的类,无论是否包含在驱动程序中或来自第三方,都可以实现此接口,并可以在需要BSON文档的任何高级API位置使用。例如

collection.find(Document("x" -> 1))
collection.find(Filters.eq("x", 1))

返回

BSON 实现