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
Visão geral
Neste guia, você pode aprender como armazenar e recuperar dados no MongoDB Kotlin Driver usando classes de dados do Kotlin.
Serialize e deserialize uma classe de dados
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.
Classe de dados de exemplo
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)
Inserir uma classe de dados
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)
Recuperar uma classe de dados
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.
Especificar conversão de componente usando anotaçõ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 |
Para obter informações de referência sobre estas anotações de propriedade, consulte o pacote org.bson.codecs.pojo.annotations.
Classe de dados anotada de exemplo
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( val deviceId: String, val name: String, val deviceType: String )
Inserir uma classe de dados anotada
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' }
Recuperar uma classe de dados anotada
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)
Operações com tipos recursivos
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=...)