Menu Docs
Página inicial do Docs
/ / /
Kotlin Coroutine
/ /

Formato de dados do documento: classes de dados

Nesta página

  • Visão geral
  • Serialize e deserialize uma classe de dados
  • Classe de dados de exemplo
  • Inserir uma classe de dados
  • Recuperar uma classe de dados
  • Especificar conversão de componente usando anotações
  • Classe de dados anotada de exemplo
  • Inserir uma classe de dados anotada
  • Recuperar uma classe de dados anotada
  • Operações com tipos recursivos

Neste guia, você pode aprender como armazenar e recuperar dados no MongoDB Kotlin Driver usando classes de dados do Kotlin.

O driver suporta nativamente a codificação e decodificação de classes de dados Kotlin para operações de leitura e gravação do MongoDB usando o registro de codec padrão. O registro de codec padrão é uma coleção de classes chamadas codecs que definem como codificar e decodificar tipos de Kotlin e Java.

Os exemplos de código nesta seção referenciam a seguinte classe de dados de amostra, que descreve um dispositivo de armazenamento de dados:

data class DataStorage(val productName: String, val capacity: Double)

Você pode inserir uma instância do DataStorage como mostrado no seguinte código:

val collection = database.getCollection<DataStorage>("data_storage")
val record = DataStorage("tape", 5.0)
collection.insertOne(record)

Você pode recuperar documentos como instâncias DataStorage e imprimi-los como demonstrado no seguinte código:

val collection = database.getCollection<DataStorage>("data_storage_devices")
// Retrieve and print the documents as data classes
val resultsFlow = collection.find()
resultsFlow.collect { println(it) }
DataStorage(productName=tape, capacity=5.0)

Você especifica uma classe para documentos retornados de uma coleção, mesmo que seja diferente da classe especificada ao recuperar a coleção.

O exemplo a seguir executa uma atualização no documento representado pela classe de dados DataStorage no exemplo anterior e retorna o documento atualizado como um tipo NewDataStorage. A operação adiciona o campo releaseDate ao documento com um valor name de tape:

// Define a data class for returned documents
data class NewDataStorage(
val productName: String,
val capacity: Double,
val releaseDate: LocalDate
)
val filter = Filters.eq(DataStorage::productName.name, "tape")
val update = Updates.currentDate("releaseDate")
val options = FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER)
// Specify the class for returned documents as the type parameter in withDocumentClass()
val result = collection
.withDocumentClass<NewDataStorage>()
.findOneAndUpdate(filter, update, options)
println("Updated document: ${result}")
Updated document: NewDataStorage(productName=tape, capacity=5.0, releaseDate=2023-06-15)

Para obter mais informações sobre esse recurso, consulte Especificar tipo de retorno no guia Bancos de dados e coleções.

Esta seção descreve as anotações que você pode utilizar para configurar o comportamento de serialização das classes de dados e fornece um exemplo para demonstrar o comportamento de anotação.

Você pode usar as seguintes anotações em classes de dados:

Nome da Anotação
Descrição
BsonId
Marca uma propriedade a ser serializada como a propriedade _id.
BsonProperty
Especifica um nome de campo de documento personalizado ao converter o campo de classe de dados para BSON.
BsonRepresentation

Especifica o tipo BSON que MongoDB utiliza para armazenar o valor. Utilize esta anotação somente quando você precisar armazenar um valor como um tipo de BSON diferente da propriedade da classe de dados.

AVISO: seu código poderá lançar uma exceção se você incluir a BsonRepresentation anotação em uma propriedade que armazena como sendo do mesmo tipo que a propriedade da classe de dados.

Para obter informações de referência sobre estas anotações de propriedade, consulte o pacote org.bson.codecs.pojo.annotations.

Os exemplos de código nesta seção referenciam a seguinte classe de dados de amostra, que descreve um dispositivo de rede:

data class NetworkDevice(
@BsonId
@BsonRepresentation(BsonType.OBJECT_ID)
val deviceId: String,
val name: String,
@BsonProperty("type")
val deviceType: String
)

Você pode inserir uma instância do NetworkDevice como mostrado no seguinte código:

val collection = database.getCollection<NetworkDevice>("network_devices")
// Insert the record
val deviceId = ObjectId().toHexString()
val device = NetworkDevice(deviceId, "Enterprise Wi-fi", "router")
collection.insertOne(device)

O documento inserido no MongoDB deve ser semelhante ao seguinte:

{
_id: ObjectId("fedc..."),
name: 'Enterprise Wi-fi',
type: 'router'
}

Você pode recuperar documentos como instâncias NetworkDevice e imprimi-los como demonstrado no seguinte código:

val collection = database.getCollection<NetworkDevice>("network_devices")
// Return all documents in the collection as data classes
val resultsFlow = collection.find()
resultsFlow.collect { println(it) }
NetworkDevice(deviceId=645cf..., name=Enterprise Wi-fi, deviceType=router)

O driver suporta nativamente codificação e decodificação de classes de dados definidas recursivamente sem causar recursão de tempo de execução. Este suporte se estende a ciclos de vários tipos de classe de dados em definições de tipo. O seguinte código fornece um exemplo de um design de classe de dados recursivo:

data class DataClassTree(
val content: String,
val left: DataClassTree?,
val right: DataClassTree?
)

Você pode executar operações de leitura e gravação em classes de dados definidas recursivamente da mesma maneira que faria com outras classes de dados. O seguinte código mostra como você pode executar uma operação de localizar em uma coleção de DataClassTree tipos:

val collection = database.getCollection<DataClassTree>("myCollection")
val filter = Filters.eq("left.left.right.content", "high german")
val resultsFlow = collection.find(filter)
resultsFlow.collect { println(it) }
DataClassTree(content=indo-european, left=DataClassTree(content=germanic, left=DataClassTree(content=german, left=null, right=DataClassTree(content=high german, ...)), right=...)

Voltar

Data Formats