Documentos
Visão geral
O driver Scala inclui duas representações específicas do Scala para documentos BSON. Seguindo a convenção da biblioteca de coleções Scala, há implementações imutáveis e mutáveis do tipo Document
. As implementações subjacentes do Document
utilizam o tipo seguro BsonDocument aula. As classes BSON estão disponíveis no namespace org.mongodb.scala.bson
, que inclui aliases de tipo e objetos complementares. Esses objetos devem ser suficientes para muitos casos de uso, mas para casos de uso avançados, talvez seja necessário usar classes do namespace org.bson
diretamente.
Importante
Nomes de chaves duplicados
O comportamento do servidor em relação a nomes de chave duplicados em um documento é indefinido. Quando um documento com nomes de chave duplicados é decodificado, o driver atribuirá o último valor associado à chave duplicada. Armazenar tal documento fará com que os outros valores sejam perdidos.
Observação
As classes Scala Document
implementam TraversableLike[(String,
BsonValue)]
e a API geral espelha a de um valor Map[String,
BsonValue]
. No entanto, ao contrário Map
, as implementações de TraversableLike
habilitam a segurança rigorosa do tipo, pois não há variação no tipo de valor.
BsonValue
é a representação segura de tipo de um tipo BSON da biblioteca org.bson
e representa tipos de valor específicos. Os tipos de valor mais comumente usados são os seguintes:
Tipo de JSON | Tipo Scala |
---|---|
Document | org.mongodb.scala.bson.Document |
Array | List |
Date | Date ou int (milésimos de segundo desde a época) |
Boolean | Boolean |
Double | Double |
Int32 | Integer |
Int64 | Long |
String | String |
Binary | Array[Byte] |
ObjectId | ObjectId |
Null | None |
É possível alterar ou estender esses mapeamentos, um processo descrito nas seções a seguir.
As seções a seguir descrevem as duas classes principais de Document
.
Documentos imutáveis
Semelhante à biblioteca de coleções Scala, a classe imutável é a classe preferida. Para conveniência, ele tem nomes alternativos de org.mongodb.scala.Document
e org.mongodb.scala.bson.Document
, além de estar disponível em org.mongodb.scala.bson.collection.immutable.Document
.
As instâncias desse tipo são imutáveis para todos. Essa coleção nunca mudará depois de criada. Portanto, você pode confiar no fato de que acessar o mesmo valor de coleção repetidamente em diferentes pontos no tempo sempre produzirá uma coleção com os mesmos elementos.
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"))
Documentos mutáveis
Para obter o tipo Document
mutável, você precisa importá-lo explicitamente de org.mongodb.scala.collections.mutable.Document
. O Document
mutável pode ser atualizado ou estendido no local. Isso significa que você pode alterar, adicionar ou remover elementos do Document
como um efeito colateral. Semelhante às coleções Scala, ao lidar com tipos mutáveis, você precisa entender qual código muda qual coleção e quando.
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.
Conversões implícitas
Para muitos dos tipos de BsonValue
, existem mapeamentos diretos lógicos de um tipo de Scala. Por exemplo, um String
mapeia para BsonString
, um Int
mapeia para BsonInt32
e um Long
mapeia para um BsonInt64
. Por conveniência, esses tipos podem ser usados diretamente com tipos Document
e são convertidos pelas características de contrato no objeto BsonMagnets
. Desde que haja um BsonTransformer
implícito no escopo para qualquer tipo, esse tipo pode ser convertido em um BsonValue
.
Os seguintes BsonTransformers
estão no escopo por padrão:
Tipo Scala | BsonValor |
---|---|
Boolean | BsonBoolean |
String | BsonString |
Array[Byte] | BsonBinary |
Regex | BsonRegex |
Date | BsonDateTime |
ObjectId | BsonObjectId |
Int | BsonInt32 |
Long | BsonInt64 |
Double | BsonDouble |
immutable.Document | BsonDocument |
mutable.Document | BsonDocument |
Option[T] | BsonValue onde T tem um BsonTransformer |
Seq[(String, T)] | BsonDocument onde T tem um BsonTransformer |
Seq[T] | BsonArray onde T tem um 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)
Isso é feito usando o Padrão img, sobre o qual você pode saber mais na publicação do blog sobre Padrão img em trigger.io.
Na API, onde normalmente esperariamos um único valor ou um par de valores-chave ou muitos pares de valores de chaves, como BsonValue
, (String
, BsonValue
) ou Iterable[(String, BsonValue)]
, exigimos qualquer coisa que possa se tornar aqueles tipos por meio de características CanBeX
que lidam com as conversões implícitas necessárias para estar em conformidade com os tipos corretos. Essas características são CanBeBsonValue
, CanBeBsonElement
e CanBeBsonElements
.
Um desses exemplos é adicionar um par de valores-chave a um Document
ou uma lista de valores:
val doc1 = Document("AL" -> "Alabama") val doc2 = Document("codes" -> List("AL", "AK", "AR"))
Bson
O driver também contém uma interface pequena, mas poderosa, chamada Bson
. Qualquer classe que represente um documento BSON, seja incluída no próprio driver ou de terceiros, pode implementar essa interface e, em seguida, ser usada em qualquer local da API de alto nível onde um documento BSON seja necessário. Por exemplo:
collection.find(Document("x" -> 1)) collection.find(Filters.eq("x", 1))