Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Learn why MongoDB was selected as a leader in the 2024 Gartner® Magic Quadrant™
Desenvolvedor do 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:
1package com.mongodb.devrel.gcr.aerodata;
2
3import org.springframework.data.annotation.Id;
4import org.springframework.data.mongodb.core.mapping.Document;
5
6@Document(collection = "aeroData")
7public abstract class AeroData {
8
9 @Id
10 public String id;
11 public Integer recordType;
12
13 //Getters and Setters...
14
15}
1package com.mongodb.devrel.gcr.aerodata;
2
3import org.springframework.data.mongodb.repository.MongoRepository;
4
5public interface AeroDataRepository extends MongoRepository<AeroData, String>{
6
7}
1package com.mongodb.devrel.gcr.aerodata;
2
3import org.springframework.data.annotation.TypeAlias;
4import org.springframework.data.mongodb.core.mapping.Document;
5
6@Document(collection = "aeroData")
7@TypeAlias("AirlineData")
8public class Airline extends AeroData{
9
10 public String airlineName;
11 public String country;
12 public String countryISO;
13 public String callsign;
14 public String website;
15
16 public Airline(String id, String airlineName, String country, String countryISO, String callsign, String website) {
17 this.id = id;
18 this.airlineName = airlineName;
19 this.country = country;
20 this.countryISO = countryISO;
21 this.callsign = callsign;
22 this.website = website;
23 }
24
25 @Override
26 public String toString() {
27 return String.format(
28 "Airline[id=%s, name='%s', country='%s (%s)', callsign='%s', website='%s']",
29 id, airlineName, country, countryISO, callsign, website);
30 }
31
32}
1package com.mongodb.devrel.gcr.aerodata;
2
3import org.springframework.data.mongodb.repository.MongoRepository;
4
5public interface AirlineRepository extends MongoRepository<Airline, String>{
6
7}
1package com.mongodb.devrel.gcr.aerodata;
2
3import org.springframework.data.annotation.TypeAlias;
4import org.springframework.data.mongodb.core.mapping.Document;
5
6@Document(collection = "aeroData")
7@TypeAlias("AircraftData")
8public class Aircraft extends AeroData{
9
10 public String tailNumber;
11 public String manufacturer;
12 public String model;
13
14 public Aircraft(String id, String tailNumber, String manufacturer, String model) {
15 this.id = id;
16 this.tailNumber = tailNumber;
17 this.manufacturer = manufacturer;
18 this.model = model;
19 }
20
21 @Override
22 public String toString() {
23 return String.format(
24 "Aircraft[id=%s, tailNumber='%s', manufacturer='%s', model='%s']",
25 id, tailNumber, manufacturer, model);
26 }
27
28}
1package com.mongodb.devrel.gcr.aerodata;
2
3import org.springframework.data.mongodb.repository.MongoRepository;
4
5public interface AircraftRepository extends MongoRepository<Aircraft, String>{
6
7}
1package com.mongodb.devrel.gcr.aerodata;
2
3import java.util.Date;
4import org.springframework.data.annotation.TypeAlias;
5import org.springframework.data.mongodb.core.mapping.Document;
6
7@Document(collection = "aeroData")
8@TypeAlias("ADSBRecord")
9public class ADSBRecord extends AeroData {
10
11 public Integer altitude;
12 public Integer heading;
13 public Integer speed;
14 public Integer verticalSpeed;
15 public Date timestamp;
16 public GeoPoint geoPoint;
17
18 public ADSBRecord(String id, Integer altitude, Integer heading, Integer speed, Integer verticalSpeed, Date timestamp, GeoPoint geoPoint) {
19 this.id = id;
20 this.altitude = altitude;
21 this.heading = heading;
22 this.speed = speed;
23 this.verticalSpeed = verticalSpeed;
24 this.timestamp = timestamp;
25 this.geoPoint = geoPoint;
26 }
27
28 @Override
29 public String toString() {
30 return String.format(
31 "ADSB[id=%s, altitude='%d', heading='%d', speed='%d', verticalSpeed='%d' timestamp='%tc', latitude='%f', longitude='%f']",
32 id, altitude, heading, speed, verticalSpeed, timestamp, geoPoint == null ? null : geoPoint.coordinates[1], geoPoint == null ? null : geoPoint.coordinates[0]);
33 }
34}
1package com.mongodb.devrel.gcr.aerodata;
2
3import org.springframework.data.mongodb.repository.MongoRepository;
4
5public interface ADSBRecordRepository extends MongoRepository<ADSBRecord, String>{
6
7}
Também adicionaremos uma classe GeoPoint para manter as informações de localização nos objetos ADSBRecord:
1package com.mongodb.devrel.gcr.aerodata;
2
3public class GeoPoint {
4 public String type;
5 public Double[] coordinates;
6
7 //Getters and Setters...
8}
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.)
1spring.data.mongodb.uri=mongodb://myusername:mypassword@abc-c0-shard-00-00.ftspj.mongodb.net:27017,abc-c0-shard-00-01.ftspj.mongodb.net:27017,abc-c0-shard-00-02.ftspj.mongodb.net:27017/air_tracker?ssl=true&replicaSet=atlas-k9999h-shard-0&authSource=admin&retryWrites=true&w=majority
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:
1package com.mongodb.devrel.gcr.aerodata;
2
3import java.util.Date;
4import java.util.Optional;
5import org.springframework.beans.factory.annotation.Autowired;
6import org.springframework.boot.CommandLineRunner;
7import org.springframework.boot.SpringApplication;
8import org.springframework.boot.autoconfigure.SpringBootApplication;
9
10@SpringBootApplication
11public class AerodataApplication implements CommandLineRunner {
12
13 @Autowired
14 private AirlineRepository airlineRepo;
15
16 @Autowired
17 private AircraftRepository aircraftRepo;
18
19 @Autowired
20 private ADSBRecordRepository adsbRepo;
21
22 public static void main(String[] args) {
23 SpringApplication.run(AerodataApplication.class, args);
24 }
25
26 @Override
27 public void run(String... args) throws Exception {
28
29 // save an airline
30 airlineRepo.save(new Airline("DAL", "Delta Air Lines", "United States", "US", "DELTA", "delta.com"));
31
32 // add some aircraft aircraft
33 aircraftRepo.save(new Aircraft("DAL_a93d7c", "N695CA", "Bombardier Inc", "CL-600-2D24"));
34 aircraftRepo.save(new Aircraft("DAL_ab8379", "N8409N", "Bombardier Inc", "CL-600-2B19"));
35 aircraftRepo.save(new Aircraft("DAL_a36f7e", "N8409N", "Airbus Industrie", "A319-114"));
36
37 //Add some ADSB position reports
38 Double[] coords1 = {55.991776, -4.776722};
39 GeoPoint geoPoint = new GeoPoint(coords1);
40 adsbRepo.save(new ADSBRecord("DAL_a36f7e_1", 38825, 319, 428, 1024, new Date(1656980617041l), geoPoint));
41 Double[] coords2 = {55.994843, -4.781466};
42 geoPoint = new GeoPoint(coords2);
43 adsbRepo.save(new ADSBRecord("DAL_a36f7e_2", 38875, 319, 429, 1024, new Date(1656980618041l), geoPoint));
44 Double[] coords3 = {55.99606, -4.783344};
45 geoPoint = new GeoPoint(coords3);
46 adsbRepo.save(new ADSBRecord("DAL_a36f7e_3", 38892, 319, 428, 1024, new Date(1656980619041l), geoPoint));
47
48
49 // fetch all airlines
50 System.out.println("Airlines found with findAll():");
51 System.out.println("-------------------------------");
52 for (Airline airline : airlineRepo.findAll()) {
53 System.out.println(airline);
54 }
55 // fetch a specific airline by ICAO ID
56 System.out.println("Airline found with findById():");
57 System.out.println("-------------------------------");
58 Optional<Airline> airlineResponse = airlineRepo.findById("DAL");
59 System.out.println(airlineResponse.get());
60
61 System.out.println();
62
63 // fetch all aircraft
64 System.out.println("Aircraft found with findAll():");
65 System.out.println("-------------------------------");
66 for (Aircraft aircraft : aircraftRepo.findAll()) {
67 System.out.println(aircraft);
68 }
69 // fetch a specific aircraft by ICAO ID
70 System.out.println("Aircraft found with findById():");
71 System.out.println("-------------------------------");
72 Optional<Aircraft> aircraftResponse = aircraftRepo.findById("DAL_a36f7e");
73 System.out.println(aircraftResponse.get());
74
75 System.out.println();
76
77 // fetch all adsb records
78 System.out.println("ADSB records found with findAll():");
79 System.out.println("-------------------------------");
80 for (ADSBRecord adsb : adsbRepo.findAll()) {
81 System.out.println(adsb);
82 }
83 // fetch a specific ADSB Record by ID
84 System.out.println("ADSB Record found with findById():");
85 System.out.println("-------------------------------");
86 Optional<ADSBRecord> adsbResponse = adsbRepo.findById("DAL_a36f7e_1");
87 System.out.println(adsbResponse.get());
88 System.out.println();
89
90 }
91
92}
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:
1Airlines found with findAll():
2-------------------------------
3Airline[id=DAL, name='Delta Air Lines', country='United States (US)', callsign='DELTA', website='delta.com']
4Airline[id=DAL_a93d7c, name='null', country='null (null)', callsign='null', website='null']
5Airline[id=DAL_ab8379, name='null', country='null (null)', callsign='null', website='null']
6Airline[id=DAL_a36f7e, name='null', country='null (null)', callsign='null', website='null']
7Airline[id=DAL_a36f7e_1, name='null', country='null (null)', callsign='null', website='null']
8Airline[id=DAL_a36f7e_2, name='null', country='null (null)', callsign='null', website='null']
9Airline[id=DAL_a36f7e_3, name='null', country='null (null)', callsign='null', website='null']
10Airline found with findById():
11-------------------------------
12Airline[id=DAL, name='Delta Air Lines', country='United States (US)', callsign='DELTA', website='delta.com']
13
14Aircraft found with findAll():
15-------------------------------
16Aircraft[id=DAL, tailNumber='null', manufacturer='null', model='null']
17Aircraft[id=DAL_a93d7c, tailNumber='N695CA', manufacturer='Bombardier Inc', model='CL-600-2D24']
18Aircraft[id=DAL_ab8379, tailNumber='N8409N', manufacturer='Bombardier Inc', model='CL-600-2B19']
19Aircraft[id=DAL_a36f7e, tailNumber='N8409N', manufacturer='Airbus Industrie', model='A319-114']
20Aircraft[id=DAL_a36f7e_1, tailNumber='null', manufacturer='null', model='null']
21Aircraft[id=DAL_a36f7e_2, tailNumber='null', manufacturer='null', model='null']
22Aircraft[id=DAL_a36f7e_3, tailNumber='null', manufacturer='null', model='null']
23Aircraft found with findById():
24-------------------------------
25Aircraft[id=DAL_a36f7e, tailNumber='N8409N', manufacturer='Airbus Industrie', model='A319-114']
26
27ADSB records found with findAll():
28-------------------------------
29ADSB[id=DAL, altitude='null', heading='null', speed='null', verticalSpeed='null' timestamp='null', latitude='null', longitude='null']
30ADSB[id=DAL_a93d7c, altitude='null', heading='null', speed='null', verticalSpeed='null' timestamp='null', latitude='null', longitude='null']
31ADSB[id=DAL_ab8379, altitude='null', heading='null', speed='null', verticalSpeed='null' timestamp='null', latitude='null', longitude='null']
32ADSB[id=DAL_a36f7e, altitude='null', heading='null', speed='null', verticalSpeed='null' timestamp='null', latitude='null', longitude='null']
33ADSB[id=DAL_a36f7e_1, altitude='38825', heading='319', speed='428', verticalSpeed='1024' timestamp='Tue Jul 05 01:23:37 BST 2022', latitude='55.991776', longitude='-4.776722']
34ADSB[id=DAL_a36f7e_2, altitude='38875', heading='319', speed='429', verticalSpeed='1024' timestamp='Tue Jul 05 01:23:38 BST 2022', latitude='55.994843', longitude='-4.781466']
35ADSB[id=DAL_a36f7e_3, altitude='38892', heading='319', speed='428', verticalSpeed='1024' timestamp='Tue Jul 05 01:23:39 BST 2022', latitude='55.996060', longitude='-4.783344']
36ADSB Record found with findById():
37-------------------------------
38ADSB[id=DAL_a36f7e_1, altitude='38825', heading='319', speed='428', verticalSpeed='1024' timestamp='Tue Jul 05 01:23:37 BST 2022', latitude='-4.776722', longitude='55.991776']
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:
1package com.mongodb.devrel.gcr.aerodata;
2
3import java.util.List;
4import java.util.Optional;
5import org.springframework.data.mongodb.repository.MongoRepository;
6import org.springframework.data.mongodb.repository.Query;
7
8public interface AirlineRepository extends MongoRepository<Airline, String>{
9
10 @Query("{_class: \"AirlineData\"}")
11 List<Airline> findAllAirlines();
12
13 @Query(value="{_id: /^?0/, _class: \"AirlineData\"}", sort = "{_id: 1}")
14 Optional<Airline> findAirlineByIcaoAddr(String icaoAddr);
15
16}
1package com.mongodb.devrel.gcr.aerodata;
2
3import java.util.List;
4import org.springframework.data.mongodb.repository.MongoRepository;
5import org.springframework.data.mongodb.repository.Query;
6
7public interface AircraftRepository extends MongoRepository<Aircraft, String>{
8
9 @Query("{_class: \"AircraftData\"}")
10 List<Aircraft> findAllAircraft();
11
12 @Query("{_id: /^?0/, _class: \"AircraftData\"}")
13 List<Aircraft> findAircraftDataByIcaoAddr(String icaoAddr);
14
15}
1package com.mongodb.devrel.gcr.aerodata;
2
3import java.util.List;
4import org.springframework.data.mongodb.repository.MongoRepository;
5import org.springframework.data.mongodb.repository.Query;
6
7public interface ADSBRecordRepository extends MongoRepository<ADSBRecord, String>{
8
9 @Query(value="{_class: \"ADSBRecord\"}",sort="{_id: 1}")
10 List<ADSBRecord> findAllADSBRecords();
11
12 @Query(value="{_id: /^?0/, _class: \"ADSBRecord\"}", sort = "{_id: 1}")
13 List<ADSBRecord> findADSBDataByIcaoAddr(String icaoAddr);
14
15}
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:
1package com.mongodb.devrel.gcr.aerodata;
2
3import java.util.Date;
4import java.util.Optional;
5import org.springframework.beans.factory.annotation.Autowired;
6import org.springframework.boot.CommandLineRunner;
7import org.springframework.boot.SpringApplication;
8import org.springframework.boot.autoconfigure.SpringBootApplication;
9
10@SpringBootApplication
11public class AerodataApplication implements CommandLineRunner {
12
13 @Autowired
14 private AirlineRepository airlineRepo;
15
16 @Autowired
17 private AircraftRepository aircraftRepo;
18
19 @Autowired
20 private ADSBRecordRepository adsbRepo;
21
22 public static void main(String[] args) {
23 SpringApplication.run(AerodataApplication.class, args);
24 }
25
26 @Override
27 public void run(String... args) throws Exception {
28
29 //Delete any records from a previous run;
30 airlineRepo.deleteAll();
31
32 // save an airline
33 airlineRepo.save(new Airline("DAL", "Delta Air Lines", "United States", "US", "DELTA", "delta.com"));
34
35 // add some aircraft aircraft
36 aircraftRepo.save(new Aircraft("DAL_a93d7c", "N695CA", "Bombardier Inc", "CL-600-2D24"));
37 aircraftRepo.save(new Aircraft("DAL_ab8379", "N8409N", "Bombardier Inc", "CL-600-2B19"));
38 aircraftRepo.save(new Aircraft("DAL_a36f7e", "N8409N", "Airbus Industrie", "A319-114"));
39
40 //Add some ADSB position reports
41 Double[] coords1 = {-4.776722, 55.991776};
42 GeoPoint geoPoint = new GeoPoint(coords1);
43 adsbRepo.save(new ADSBRecord("DAL_a36f7e_1", 38825, 319, 428, 1024, new Date(1656980617041l), geoPoint));
44 Double[] coords2 = {-4.781466, 55.994843};
45 geoPoint = new GeoPoint(coords2);
46 adsbRepo.save(new ADSBRecord("DAL_a36f7e_2", 38875, 319, 429, 1024, new Date(1656980618041l), geoPoint));
47 Double[] coords3 = {-4.783344, 55.99606};
48 geoPoint = new GeoPoint(coords3);
49 adsbRepo.save(new ADSBRecord("DAL_a36f7e_3", 38892, 319, 428, 1024, new Date(1656980619041l), geoPoint));
50
51
52 // fetch all airlines
53 System.out.println("Airlines found with findAllAirlines():");
54 System.out.println("-------------------------------");
55 for (Airline airline : airlineRepo.findAllAirlines()) {
56 System.out.println(airline);
57 }
58 System.out.println();
59 // fetch a specific airline by ICAO ID
60 System.out.println("Airlines found with findAirlineByIcaoAddr(\"DAL\"):");
61 System.out.println("-------------------------------");
62 Optional<Airline> airlineResponse = airlineRepo.findAirlineByIcaoAddr("DAL");
63 System.out.println(airlineResponse.get());
64
65 System.out.println();
66
67 // fetch all aircraft
68 System.out.println("Aircraft found with findAllAircraft():");
69 System.out.println("-------------------------------");
70 for (Aircraft aircraft : aircraftRepo.findAllAircraft()) {
71 System.out.println(aircraft);
72 }
73 System.out.println();
74 // fetch Aircraft Documents specific to airline "DAL"
75 System.out.println("Aircraft found with findAircraftDataByIcaoAddr(\"DAL\"):");
76 System.out.println("-------------------------------");
77 for (Aircraft aircraft : aircraftRepo.findAircraftDataByIcaoAddr("DAL")) {
78 System.out.println(aircraft);
79 }
80
81 System.out.println();
82
83 // fetch Aircraft Documents specific to aircraft "a36f7e"
84 System.out.println("Aircraft found with findAircraftDataByIcaoAddr(\"DAL_a36f7e\"):");
85 System.out.println("-------------------------------");
86 for (Aircraft aircraft : aircraftRepo.findAircraftDataByIcaoAddr("DAL_a36f7e")) {
87 System.out.println(aircraft);
88 }
89
90 System.out.println();
91
92 // fetch all adsb records
93 System.out.println("ADSB records found with findAllADSBRecords():");
94 System.out.println("-------------------------------");
95 for (ADSBRecord adsb : adsbRepo.findAllADSBRecords()) {
96 System.out.println(adsb);
97 }
98 System.out.println();
99 // fetch ADSB Documents specific to airline "DAL"
100 System.out.println("ADSB Documents found with findADSBDataByIcaoAddr(\"DAL\"):");
101 System.out.println("-------------------------------");
102 for (ADSBRecord adsb : adsbRepo.findADSBDataByIcaoAddr("DAL")) {
103 System.out.println(adsb);
104 }
105
106 System.out.println();
107
108 // fetch ADSB Documents specific to aircraft "a36f7e"
109 System.out.println("ADSB Documents found with findADSBDataByIcaoAddr(\"DAL_a36f7e\"):");
110 System.out.println("-------------------------------");
111 for (ADSBRecord adsb : adsbRepo.findADSBDataByIcaoAddr("DAL_a36f7e")) {
112 System.out.println(adsb);
113 }
114 }
115}
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:
1Airlines found with findAllAirlines():
2-------------------------------
3Airline[id=DAL, name='Delta Air Lines', country='United States (US)', callsign='DELTA', website='delta.com']
4
5Airlines found with findAirlineByIcaoAddr("DAL"):
6-------------------------------
7Airline[id=DAL, name='Delta Air Lines', country='United States (US)', callsign='DELTA', website='delta.com']
8
9Aircraft found with findAllAircraft():
10-------------------------------
11Aircraft[id=DAL_a93d7c, tailNumber='N695CA', manufacturer='Bombardier Inc', model='CL-600-2D24']
12Aircraft[id=DAL_ab8379, tailNumber='N8409N', manufacturer='Bombardier Inc', model='CL-600-2B19']
13Aircraft[id=DAL_a36f7e, tailNumber='N8409N', manufacturer='Airbus Industrie', model='A319-114']
14
15Aircraft found with findAircraftDataByIcaoAddr("DAL"):
16-------------------------------
17Aircraft[id=DAL_a36f7e, tailNumber='N8409N', manufacturer='Airbus Industrie', model='A319-114']
18Aircraft[id=DAL_a93d7c, tailNumber='N695CA', manufacturer='Bombardier Inc', model='CL-600-2D24']
19Aircraft[id=DAL_ab8379, tailNumber='N8409N', manufacturer='Bombardier Inc', model='CL-600-2B19']
20
21Aircraft found with findAircraftDataByIcaoAddr("DAL_a36f7e"):
22-------------------------------
23Aircraft[id=DAL_a36f7e, tailNumber='N8409N', manufacturer='Airbus Industrie', model='A319-114']
24
25ADSB records found with findAllADSBRecords():
26-------------------------------
27ADSB[id=DAL_a36f7e_1, altitude='38825', heading='319', speed='428', verticalSpeed='1024' timestamp='Tue Jul 05 01:23:37 BST 2022', latitude='55.991776', longitude='-4.776722']
28ADSB[id=DAL_a36f7e_2, altitude='38875', heading='319', speed='429', verticalSpeed='1024' timestamp='Tue Jul 05 01:23:38 BST 2022', latitude='55.994843', longitude='-4.781466']
29ADSB[id=DAL_a36f7e_3, altitude='38892', heading='319', speed='428', verticalSpeed='1024' timestamp='Tue Jul 05 01:23:39 BST 2022', latitude='55.996060', longitude='-4.783344']
30
31ADSB Documents found with findADSBDataByIcaoAddr("DAL"):
32-------------------------------
33ADSB[id=DAL_a36f7e_1, altitude='38825', heading='319', speed='428', verticalSpeed='1024' timestamp='Tue Jul 05 01:23:37 BST 2022', latitude='55.991776', longitude='-4.776722']
34ADSB[id=DAL_a36f7e_2, altitude='38875', heading='319', speed='429', verticalSpeed='1024' timestamp='Tue Jul 05 01:23:38 BST 2022', latitude='55.994843', longitude='-4.781466']
35ADSB[id=DAL_a36f7e_3, altitude='38892', heading='319', speed='428', verticalSpeed='1024' timestamp='Tue Jul 05 01:23:39 BST 2022', latitude='55.996060', longitude='-4.783344']
36
37ADSB Documents found with findADSBDataByIcaoAddr("DAL_a36f7e"):
38-------------------------------
39ADSB[id=DAL_a36f7e_1, altitude='38825', heading='319', speed='428', verticalSpeed='1024' timestamp='Tue Jul 05 01:23:37 BST 2022', latitude='55.991776', longitude='-4.776722']
40ADSB[id=DAL_a36f7e_2, altitude='38875', heading='319', speed='429', verticalSpeed='1024' timestamp='Tue Jul 05 01:23:38 BST 2022', latitude='55.994843', longitude='-4.781466']
41ADSB[id=DAL_a36f7e_3, altitude='38892', heading='319', speed='428', verticalSpeed='1024' timestamp='Tue Jul 05 01:23:39 BST 2022', latitude='55.996060', longitude='-4.783344']
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
Tutorial

Geração aumentada de recuperação com MongoDB e Spring AI: Trazendo AI para seus aplicativos Java


Sep 23, 2024 | 6 min read
Tutorial

Explorando recursos de pesquisa com o Atlas Search


Aug 20, 2024 | 9 min read
Início rápido

Java - Change Streams


Oct 01, 2024 | 10 min read
Início rápido

Introdução ao MongoDB e Helidon


Nov 12, 2024 | 6 min read
Sumário
  • Acessando dados de coleção única polimórficos usando o Spring Data MongoDB