EventoObtenha 50% de desconto no seu ingresso para MongoDB.local Londres em outubro 2. Use o código WEB50Saiba mais >>
Desenvolvedor MongoDB
Central de desenvolvedor do MongoDBchevron-right
Idiomaschevron-right
Javachevron-right

Projetos de coleção única no MongoDB com dados Spring (Parte 2)

Graeme Robinson10 min read • Published Oct 17, 2022 • Updated Aug 12, 2024
SpringMongoDBJava
Ícone do FacebookÍcone do Twitterícone do linkedin
Spring
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Na Parte 1 desta série de duas partes, discutimos padrões de design de coleção única no MongoDB e como eles podem ser usados para evitar a necessidade de junções computacionalmente caras entre coleções. Nesta segunda parte da série, forneceremos exemplos de como o padrão de coleção única pode ser utilizado em aplicações Java usando o Spring Data MongoDB e, em particular, como documentos que representam classes diferentes, mas residem na mesma coleção, podem ser acessados.

Acessando dados de coleção única polimórficos usando o Spring Data MongoDB

Embora as interfaces idiomáticas nativas oficiais do MongoDB estejam disponíveis para 12 diferentes linguagens de programação, com interfaces fornecidas pela comunidade disponíveis para muitas outras, muitos de nossos clientes já têm investimentos e conhecimentos significativos no desenvolvimento de aplicativos Java usando Spring Data. Uma pergunta comum que nos fazem é como acessar documentos polimórficos de coleção única usando o Spring Data MongoDB?
Nas próximas etapas, mostrarei como o modelo de template do Spring Data pode ser usado para mapear documentos de relatórios de posição de companhias aéreas, aeronaves e ADSB em uma única coleção chamada aerodata, para POJOs correspondentes em um aplicativo Spring.
Os exemplos de código a seguir foram criados usando o Netbeans IDE, mas qualquer IDE compatível com Java IDE, incluindo o Eclipse e o IntelliJ IDEA, pode ser usado.
Para começar, visite o site Spring Initializr e crie um novo projeto Spring Boot, adicionando Spring Data MongoDB como uma dependência. No meu exemplo estou usando Gradle, mas você pode usar Maven, se preferir.
Captura de tela do website do Spring Initializr
Gere seu projeto modelo, descompacte-o e abra-o em seu IDE:
Captura de tela do Netbeans IDE com nosso projeto Spring Boot gerado aberto.
Adicione um pacote ao seu projeto para armazenar o POJO, a classe de repositório e as definições de interface. (No meu projeto, criei um pacote chamado (com.mongodb.devrel.gcr.aerodata). Para nossa demonstração, adicionaremos quatro POJOs — AeroData, Airline, Aircraft e ADSBRecord — para representar nossos dados, com quatro repositórios correspondentes definições da interface. AeroData será uma classe de base abstrata a partir da qual os outros POJOs se estenderão:
Também adicionaremos uma classe GeoPoint para manter as informações de localização nos objetos ADSBRecord:
Observe as anotações usadas nas quatro classes POJO principais. Usamos a anotação "@Document" para especificar a coleção do MongoDB na qual os dados de cada classe devem ser salvos. Em cada caso, especificamos a coleção "aeroData". Nas classes Airline, Airship e ADSBRecord, também usamos a anotação "@TypeAlias". O Spring Data adicionará automaticamente um campo "_class" a cada um de nossos documentos contendo o nome da classe Java do objeto de origem. A anotação TypeAlias nos permite substituir o valor salvo nesse campo e pode ser útil no início do desenvolvimento de um projeto se houver suspeita de que o tipo de classe possa mudar. Finalmente, na classes abstrata AeroData, usamos a anotação "@id" para especificar o campo que o Spring Data usará no campo MongoDB _id de nossos documentos.
Vamos atualizar nosso projeto para adicionar e recuperar alguns dados. Comece adicionando seu URI de conexão do MongoDB a application.properties. (Se necessário, crie um MongoDB Atlas cluster gratuito cadastrando-se em cloud.mongodb.com.)
Observe que ter credenciais de usuário não criptografadas em um arquivo de propriedades obviamente não é a melhor prática do ponto de vista da segurança e essa abordagem deve ser usada apenas para fins de teste e instrução. Para obter mais detalhes sobre as opções de conexão segura ao MongoDB, incluindo o uso de armazenamentos de chaves e mecanismos de identidade na nuvem, consulte a documentação do MongoDB.
Com os detalhes da conexão prontos, podemos agora atualizar a classe de entrada do aplicativo principal. Como não estamos usando uma exibição ou um controlador, configuraremos o aplicativo como um CommandLineRunner para exibir a saída na linha de comando:
O Spring Boot cuida de muitos detalhes em segundo plano para nós, incluindo o estabelecimento de uma conexão com o MongoDB e a ligação automática de nossas classes de repositório. Ao executar o aplicativo, estamos:
  1. Usando o método save nos repositórios Airline, Aircraft e ADSBRecord, respectivamente, para adicionar uma companhia aérea, três aeronaves e três documentos de relatório de posição ADSB à nossa coleção.
  2. Usando os métodos findAll e findById nos repositórios Airline, Aircraft e ADSBRecord, respectivamente, para recuperar, por sua vez, todos os documentos de companhias aéreas, um documento de companhia aérea específico, todos os documentos de aeronave, um documento específico de qualquer aeronave, todos os documentos de relatório de posição ADSB e um ADSB específico documento de relatório de posição.
Se tudo estiver configurado corretamente, veremos a seguinte saída na linha de comando:
Como você pode ver, nossos dados foram adicionados com sucesso à coleção do MongoDB e podemos recuperar os dados. No entanto, há um problema. Os métodos findAll de cada um dos objetos de repositório estão retornando um resultado para cada documento em nossa coleção, não apenas os documentos do tipo de classe associado a cada repositório. Como resultado, sete documentos são retornados para cada tipo de registro – companhia aérea, aeronave e ADSB – quando esperaríamos ver apenas uma companhia aérea, três aeronaves e três relatórios de posição do ADSB. Observe que esse problema é comum em todos os métodos de repositório "All" — findAll, deleteAll e notifyAll. Uma chamada para o método deleteAll no repositório da companhia aérea resultaria na exclusão de todos os documentos da coleção, não apenas dos documentos da companhia aérea.
Para resolver isso, temos duas opções: podemos substituir os métodos padrão findAll (e deleteAll/notifyAll) do repositório Spring Boot para incluir métodos na classe associada a cada classe de repositório de chamada, ou podemos estender as definições da interface do repositório para incluir métodos para especificamente recuperar somente documentos da classe correspondente. Em nosso exercício, nos concentraremos na abordagem posterior atualizando as definições de interface do repositório:
Em cada interface, adicionamos duas novas definições de função: uma para retornar todos os documentos do tipo relevante e outra para permitir que os documentos sejam devolvidos ao pesquisar pelo endereço ICAO. Usando a anotação @Query, podemos formatar as queries conforme necessário.
Com nossas definições de função em vigor, agora podemos atualizar a classe de aplicativo principal:
Observe que, além das chamadas de pesquisa revisadas, também adicionamos uma chamada para DeleteAll no repositório da companhia aérea para remover dados adicionados por execuções anteriores do aplicativo.
Com as atualizações em vigor, quando executarmos o aplicativo, devemos ver o resultado esperado:
Nesta publicação de duas partes, vimos como os projetos polimórficos de coleção única no MongoDB podem fornecer toda a flexibilidade de queries dos projetos relacionais normalizados e, ao mesmo tempo, evitar antipadrões, como arrays ilimitados e junções desnecessárias. Isso torna as coleções resultantes altamente eficientes do ponto de vista de pesquisar e passíveis de dimensionamento horizontal. Também mostramos como podemos trabalhar com esses projetos usando o Spring Data MongoDB.
O exemplo de código-fonte usado nesta série está disponível no Github.

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Início rápido

Introdução ao Minecraft e ao MongoDB


Jul 15, 2024 | 4 min read
Artigo

Como a Queryable Encryption pode manter o James Bond seguro


Apr 02, 2024 | 2 min read
Podcast

Expansão do setor de jogos com Gaspard Petit, da Square Enix


Mar 22, 2023 | 29 min
Tutorial

Como migrar do Realm Java SDK para o Realm Kotlin SDK


May 09, 2022 | 5 min read
Sumário
  • Acessando dados de coleção única polimórficos usando o Spring Data MongoDB