Latihan - Mengkueri dengan menggunakan Azure Cosmos DB Java SDK
Sekarang setelah membuat dokumen di aplikasi Anda, mari kita mengkueri dari aplikasi Anda. Azure Cosmos DB Java SDK menggunakan kueri SQL. .NET SDK memiliki dukungan tambahan untuk kueri LINQ, tetapi Java SDK tidak memiliki analog. Unit ini fokus menjalankan kueri SQL dari aplikasi Anda, bukan dari portal.
Kami akan menggunakan dokumen pengguna yang Anda buat untuk aplikasi peritel online Anda untuk menguji kueri ini.
Menjalankan kueri SQL
Contoh berikut menunjukkan bagaimana kueri dapat dilakukan di SQL dari kode Java Anda. Salin kode dan tambahkan ke akhir file CosmosApp.java.
/** * Execute a custom query on the Azure Cosmos DB container. * @param query Query String. */ private static void executeSimpleQuery(final String query) { final int preferredPageSize = 10; CosmosQueryRequestOptions queryOptions = new CosmosQueryRequestOptions(); CosmosPagedFlux<User> pagedFluxResponse = container.queryItems( query, queryOptions, User.class); logger.info("Running SQL query..."); pagedFluxResponse.byPage(preferredPageSize).flatMap(fluxResponse -> { logger.info("Got a page of query result with " + fluxResponse.getResults().size() + " items(s) and request charge of " + fluxResponse.getRequestCharge()); logger.info("Item Ids " + fluxResponse .getResults() .stream() .map(User::getId) .collect(Collectors.toList())); return Flux.empty(); }).blockLast(); }
Dalam kode ini, perhatikan bahwa kita sekali lagi menggunakan model pemrograman aliran data deklaratif Reaktor Proyek. Kali ini, kami menggunakannya untuk menangani halaman respons kueri secara asinkron. Kami menunjukkan pendekatan asinkron karena dalam kasus penggunaan nyata, mungkin ada ratusan atau ribuan tanggapan terhadap kueri. Menggabungkan respons kueri dapat menjadi tugas intensif CPU yang mendapat manfaat dari peningkatan efisiensi alur pemrograman asinkron.
Singkatnya, kami ingin throughput tinggi dalam menangani respons kueri, atau halaman tinggi/detik per alur.
queryitems
mengembalikan instansCosmosPagedFlux
pagedFluxResponse
, danpagedFluxResponse.byPage(preferredPageSize)
membuat instansFlux
yang merupakan sumber aktivitas halaman asinkron. Alur operasi di dalam.flatMap( ... ).blockLast();
beroperasi secara asinkron dan pseudo-paralel pada halaman respons kueri yang terkait dengan setiap aktivitas yang dipancarkan oleh instansFlux
.Salin dan tempel kode berikut ke metode
basicOperations
Anda, sebelum kode penghapusan dokumen.executeSimpleQuery("SELECT * FROM User WHERE User.lastName = 'Pindakova'");
Buat dan jalankan CosmosApp.java pada IDE, atau jalankan program di terminal dengan menggunakan:
mvn clean package mvn exec:java -Dexec.mainClass="com.azure.cosmos.examples.mslearnbasicapp.CosmosApp"
Di terminal, output harus terlihat seperti ini:
INFO: Database and container validation complete INFO: User 1 already exists in the database INFO: User 2 already exists in the database INFO: Read User 1 INFO: Replaced last name for Suh INFO: Running SQL query... INFO: Got a page of query result with 1 items(s) and request charge of 2.83 INFO: Item Ids [2] INFO: Deleted User 1
Sekarang setelah membuat dokumen di aplikasi Anda, mari kita mengkueri dari aplikasi Anda. Spring Data Azure Cosmos DB memaparkan metode kueri yang diturunkan serta metode kueri kustom - dan kedua build ini pada kemampuan kueri bahasa SQL dari Azure Cosmos DB Java SDK v4 yang mendasarinya. Unit ini fokus menjalankan kueri Spring Data Azure Cosmos DB dari aplikasi Anda, bukan dari portal.
Kami akan menggunakan dokumen WebCustomer
yang Anda buat untuk aplikasi peritel online Anda guna menguji kueri ini.
Membuat dan memanggil metode kueri yang diturunkan
Metode kueri yang diturunkan adalah metode repositori Spring Data tanpa implementasi; sebagai gantinya, nama metode memberi sinyal Spring Data untuk menerjemahkan setiap panggilan metode dan argumennya ke dalam kueri pada database yang mendasarinya. Misalnya, saat Anda memanggil findById
dengan beberapa argumen, Spring Data membaca nama metode sebagai "temukan menurut ID" dan menggabungkan kueri database yang mengembalikan dokumen yang ditentukan oleh argumen.
Spring Data Azure Cosmos DB mencakup sejumlah metode kueri yang diturunkan bawaan termasuk findById
. Di bagian ini, kami akan menunjukkan cara menerapkan metode kueri baru yang diturunkan.
Kami akan membuat metode kueri yang diturunkan yang mengirim kueri ke semua dokumen yang memiliki nilai tertentu untuk bidang
firstName
. Buka ReactiveWebCustomerRepository.java. Anda akan melihat deklarasi metode berikut:Flux<WebCustomer> findByFirstName(String firstName);
Metode repositori ini mendeklarasikan kepada Spring Data bahwa Anda menginginkan metode yang mengirim kueri pada
firstName
saat dipanggil. Perlu diingat bahwa kelasWebCustomer
dimulai dengan anotasi@Container
yang menentukancontainerName
sebagaiWebCustomers
. KarenafindByFirstName
mengembalikanFlux<WebCustomer>
, Spring Data tahu harus mengkueriWebCustomers
saat metode ini dipanggil.Salin dan tempel kode berikut ke metode
run
Anda, sebelum panggilandeleteWebCustomerDocument
.logger.info("Running derived query..."); Flux<WebCustomer> webCustomers = reactiveWebCustomerRepository.findByFirstName("Max"); webCustomers.flatMap(webCustomer -> { logger.info("- WebCustomer is : {}", webCustomer.getUserId()); return Mono.empty(); }).blockLast();
Dalam kode ini, perhatikan bahwa kita sekali lagi menggunakan model pemrograman aliran data deklaratif Reaktor Proyek. Kali ini, kami menggunakannya untuk menangani halaman respons kueri secara asinkron. Kami menunjukkan pendekatan asinkron karena dalam kasus penggunaan nyata, mungkin ada ratusan atau ribuan tanggapan terhadap kueri. Menggabungkan respons kueri dapat menjadi tugas intensif CPU yang mendapat manfaat dari peningkatan efisiensi alur pemrograman asinkron.
Singkatnya, kami ingin throughput tinggi dalam menangani respons kueri, atau respons tinggi/detik per alur.
findByFirstName
mengembalikan instansFlux<WebCustomer>
webCustomers
. Alur operasi di dalam.flatMap( ... ).blockLast();
beroperasi secara asinkron dan pseudo-paralel pada respons kueri yang terkait dengan setiap aktivitas yang dipancarkan olehFlux<WebCustomer>
.Buat dan jalankan CosmosSample.java pada IDE, atau jalankan program di terminal menggunakan:
mvn clean package mvn spring-boot:run
Di terminal, output harus terlihat seperti ini:
INFO: - WebCustomer is : maxaxam
Membuat dan memanggil metode kueri kustom
Metode kueri kustom adalah metode repositori Spring Data dengan anotasi @Query
yang menentukan string kueri - dan string kueri berisi placeholder untuk argumen metode. Kali ini, nama metode tidak berdampak pada kueri apa yang dilakukan. Anotasi @Query
memberi sinyal Spring Data untuk mengeluarkan kueri bahasa SQL ke database yang mendasarinya, setelah mengisi placeholder argumen dengan nilai argumen metode.
Kami akan membuat metode kueri kustom yang mengkueri ke semua dokumen yang memiliki nilai tertentu untuk bidang
lastName
. Buka ReactiveWebCustomerRepository.java. Anda akan melihat deklarasi metode berikut:@Query(value = "SELECT * FROM User WHERE User.lastName = @lastName") Flux<WebCustomer> findByLastName(@Param("lastName") String lastName);
Metode repositori ini mendeklarasikan kepada Spring Data bahwa Anda menginginkan metode yang mengirim kueri pada
lastName
saat dipanggil. Nilai argumenlastName
akan diganti untuk placeholder@lastName
.Salin dan tempel kode berikut ke metode
run
Anda, setelah kode kueri yang diturunkan.logger.info("Running custom query..."); webCustomers = reactiveWebCustomerRepository.findByLastName("Axam"); webCustomers.flatMap(webCustomer -> { logger.info("- WebCustomer is : {}", webCustomer.getUserId()); return Mono.empty(); }).blockLast();
Buat dan jalankan CosmosSample.java pada IDE, atau jalankan program di terminal menggunakan:
mvn clean package mvn spring-boot:run
Di terminal, output harus terlihat seperti ini:
INFO: Running derived query... INFO: - WebCustomer is : maxaxam INFO: Running custom query... INFO: - WebCustomer is : maxaxam
Di unit ini, Anda belajar tentang kueri yang diturunkan dan kustom. Anda kemudian menambahkan kedua jenis kueri ke aplikasi Anda untuk mengambil rekaman pengguna.