Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/ / /
Kotlin Coroutine
/ /

Formato de dados do documento: classes de dados

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)

Dica

Métodos de construtor e propriedades de classe de dados

Você pode usar os métodos de classes de construtores diretamente com propriedades de classe de dados adicionando a dependência opcional de extensões de driver Kotlin ao seu aplicação. Para saber mais e ver exemplos, consulte o guia Use Builders with Data Classes.

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

Nesta página