Visão geral
Neste guia, você aprenderá como armazenar e recuperar dados no driver Java do MongoDB usando registros Java. Os registros Java são um tipo de classe Java frequentemente usado para modelar dados e separar a lógica de negócios da representação de dados.
Dica
Você pode declarar registros Java no Java 16 ou posterior. Saiba mais sobre a funcionalidade e as restrições dos registros em Java 17 Atualizações de linguagens: classes de registros.
Se você estiver usando uma versão anterior do Java, poderá usar objetos Java antigos simples. Consulte o guia Formato de data do documento: POJOs para obter detalhes da implementação.
Observação
Se você usa o driver em um container OSGi e seu aplicativo usar o driver para codificar ou decodificar registros Java, será necessário adicionar uma dependência explícita ao módulo org.bson.codecs.record. Saiba mais sobre como definir dependências para containers OSGi acessando a documentação do IBM OSGi.
Serializar e desserializar um registro
O driver suporta nativamente a codificação e a decodificação de registros Java para operações de leitura e gravação do MongoDB usando o registro de codec padrão. O registro de codecs padrão é uma coleção de classes chamadas codecs que definem como converter tipos Java de codificação e decodificação. Saiba mais sobre codecs e o registro de codec padrão no guia sobre Codificar dados com codecs de tipo.
Exemplo de registro
Os exemplos de código nesta seção referenciam o seguinte registro de amostra, que descreve um dispositivo de armazenamento de dados:
public record DataStorageRecord( String productName, double capacity) {}Inserir um registro
Você pode inserir uma instância do DataStorageRecord como mostrado no seguinte código:
MongoCollection<DataStorageRecord> collection = database.getCollection("data_storage_devices", DataStorageRecord.class);
// insert the recordcollection.insertOne(new DataStorageRecord("2TB SSD", 1.71));Recuperar um registro
Você pode recuperar documentos como instâncias DataStorageRecord e imprimi-los como demonstrado no seguinte código:
MongoCollection<DataStorageRecord> collection = database.getCollection("data_storage_devices", DataStorageRecord.class);
// retrieve and print the recordsList<DataStorageRecord> records = new ArrayList<DataStorageRecord>();collection.find().into(records);records.forEach(System.out::println);DataStorageRecord[productName=1TB SSD, capacity=1.71]Especificar conversão de componente usando anotações
Esta seção descreve como configurar o comportamento de serialização dos componentes de registro usando anotações. Para obter uma lista completa das anotações compatíveis, consulte a documentação da API do pacote org.bson.codecs.pojo.annotations.
Observação
O driver suporta anotações para registros Java, mas somente se você incluí-los ao definir o componente, conforme mostrado no registro de exemplo a seguir. Você não pode usar as anotações dentro do construtor de registro.
Exemplo de registro anotado
Os exemplos de código nesta seção referenciam o seguinte registro de amostra, que descreve um dispositivo de rede:
import org.bson.BsonType;import org.bson.codecs.pojo.annotations.BsonProperty;import org.bson.codecs.pojo.annotations.BsonId;import org.bson.codecs.pojo.annotations.BsonRepresentation;
public record NetworkDeviceRecord( @BsonId() @BsonRepresentation(BsonType.OBJECT_ID) String deviceId, String name, @BsonProperty("type") String deviceType ){}Inserir um registro anotado
Você pode inserir uma instância do DataStorageRecord como mostrado no seguinte código:
MongoCollection<NetworkDeviceRecord> collection = database.getCollection("network_devices", NetworkDeviceRecord.class);
// insert the recordString deviceId = new ObjectId().toHexString();collection.insertOne(new NetworkDeviceRecord(deviceId, "Enterprise Wi-fi", "router"));O documento inserido no MongoDB é semelhante ao seguinte:
{ _id: ObjectId("fedc..."), name: 'Enterprise Wi-fi', type: 'router'}Recuperar um registro anotado
Você pode recuperar documentos como instâncias NetworkDeviceRecord e imprimi-los como demonstrado no seguinte código:
MongoCollection<NetworkDeviceRecord> collection = database.getCollection("network_devices", NetworkDeviceRecord.class);
// return all documents in the collection as recordsList<NetworkDeviceRecord> records = new ArrayList<NetworkDeviceRecord>();collection.find().into(records);records.forEach(System.out::println);NetworkDeviceRecord[deviceId=fedc..., name=Enterprise Wi-fi, deviceType=router]Observação
O pacote org.bson.codecs.records.annotations está obsoleto. Em vez disso, use as anotações equivalentes do pacote org.bson.codecs.pojo.annotations.
Operações com tipos recursivos
O driver aceita nativamente a codificação e decodificação de registros definidos recursivamente sem causar recursão no tempo de execução. Este suporte se estende a ciclos de vários tipos de registros em definições de tipo. O seguinte código fornece um exemplo de um design de registro recursivo:
public record RecordTree( String content, RecordTree left, RecordTree right) {}Você pode realizar operações de leitura e gravação em registros definidos recursivamente da mesma forma que faria com outros registros. O seguinte código mostra como você pode executar uma operação de localizar em uma coleção de RecordTree tipos:
MongoDatabase database = mongoClient.getDatabase("myDB");MongoCollection<RecordTree> collection = database.getCollection("myCollection", RecordTree.class);
Bson filter = Filters.eq("left.left.right.content", "Ikatere");collection.find(filter).forEach(doc -> System.out.println(doc));RecordTree[content=Ranginui, left=RecordTree[content=..., left=RecordTree[content=..., right=RecordTree[content=Ikatere...]]Recuperar o codec do registro
Você pode usar o RecordCodecProvider para recuperar o codec de registro. Use esta interface para personalizar o codec para codificar e decodificar objetos de registro Java de e para tipos BSON correspondentes, reduzindo código duplicado. Para saber mais sobre codecs e seu uso, consulte Codecs.
Não é possível criar um codec de registro diretamente, mas você pode utilizar o RecordCodecProvider para implementar o codec de registro em seu código. Para saber mais sobre o RecordCodecProvider, consulte a documentação da API.