التمرين - الاستعلام باستخدام Azure Cosmos DB Java SDK
الآن بعد أن قمت بإنشاء مستندات في التطبيق الخاص بك، لنستعلم عنها من التطبيق الخاص بك. يستخدم Azure Cosmos DB Java SDK استعلامات SQL. لدى SDK.NET دعم إضافي لاستعلامات LINQ ولكن SDK Java لا يوجد تماثل. تركز هذه الوحدة على تشغيل استعلامات SQL من التطبيق الخاص بك، بدلاً من المدخل.
سنستخدم مستندات المستخدم التي أنشأتها لتطبيق متاجر التجزئة عبر الإنترنت لاختبار هذه الاستعلامات.
تشغيل استعلامات SQL
يوضح النموذج التالي كيف يمكن إجراء استعلام في SQL من التعليمات البرمجية الخاصة بك لـ Java. انسخ التعليمات البرمجية وأضفها إلى نهاية ملف 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(); }
في هذا الكود، لاحظ أننا مرة أخرى نستخدم نموذج برمجة تدفق البيانات التعريفي الخاص بـ Project Reactor. نستخدمها هذه المرة لمعالجة صفحات استجابة الاستعلام بشكل غير متزامن. نبرهن على نهج غير متزامن لأنه في حالة استخدام حقيقية، قد يكون هناك مئات أو آلاف من الردود على استعلام ما. يمكن أن يكون تجميع استجابات الاستعلام مهمة مكثفة لوحدة المعالجة المركزية تستفيد من زيادة كفاءة مؤشر الترابط في البرمجة غير المتزامنة.
باختصار، نريد معدل نقل عاليًا من معالجة استجابات الاستعلام أو صفحات عالية/ثانية لكل مؤشر ترابط.
queryitems
إرجاع المثيلCosmosPagedFlux
pagedFluxResponse
، وإنشاءpagedFluxResponse.byPage(preferredPageSize)
Flux
مثيل مصدر لأحداث الصفحة غير المتزامنة. يعمل مسار العمليات داخل.flatMap( ... ).blockLast();
بشكل غير متزامن وبالتوازي الزائف في صفحة استجابة الاستعلام المقترنة بكل حدث منبعثة من المثيلFlux
.نسخ ولصق التعليمات البرمجية التالية إلى الأسلوب
basicOperations
الخاص بك قبل التعليمة البرمجية لحذف المستند.executeSimpleQuery("SELECT * FROM User WHERE User.lastName = 'Pindakova'");
إنشاء وتشغيل CosmosApp.java في IDE، أو تشغيل البرنامج في المحطة الطرفية باستخدام:
mvn clean package mvn exec:java -Dexec.mainClass="com.azure.cosmos.examples.mslearnbasicapp.CosmosApp"
في الوحدة الطرفية، يجب أن يبدو الإخراج شيئًا من هذا القبيل:
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
الآن بعد أن قمت بإنشاء مستندات في التطبيق الخاص بك، لنستعلم عنها من التطبيق الخاص بك. تكشف Spring Data Azure Cosmos DB كلاً من طرق الاستعلام المشتقة بالإضافة إلى طرق الاستعلام المخصصة - وكلاهما يعتمد على إمكانية استعلام لغة SQL للإصدار الأساسي Azure Cosmos DB Java SDK v4. تركز هذه الوحدة على Spring Data Azure Cosmos DB من التطبيق الخاص بك، بدلاً من المدخل.
سنستخدم WebCustomer
المستندات التي أنشأتها لتطبيق بائع التجزئة عبر الإنترنت لاختبار هذه الاستعلامات.
إنشاء واستدعاء أساليب الاستعلام المشتقة
أساليب الاستعلام المشتقة هي أساليب مستودع Spring Data بدون تنفيذ؛ بدلا من ذلك، يشير اسم الأسلوب إلى Spring Data لترجمة كل استدعاء أسلوب ووسيطاته إلى استعلام على قاعدة البيانات الأساسية. على سبيل المثال، عند الاتصال findById
ببعض الوسيطات، يقرأ Spring Data اسم الأسلوب ك "بحث حسب المعرف" ويجمع استعلام قاعدة بيانات يقوم بإرجاع المستند المحدد بواسطة الوسيطات.
يتضمن Spring Data Azure Cosmos DB عدداً من طرق الاستعلام المشتقة المضمنة بما في ذلكfindById
. في هذا القسم، سوف نعرض كيفية تطبيق أساليب الاستعلام المشتقة الجديدة.
سننشئ أسلوب استعلام مشتق يستعلم عن جميع المستندات التي لها قيمة معينة للحقل
firstName
. انتقل إلى ReactiveWebCustomerRepository.java. سترى إعلان الأسلوب التالي:Flux<WebCustomer> findByFirstName(String firstName);
يعلن أسلوب المستودع هذا ل Spring Data أنك تريد أسلوبا يستعلم عنه
firstName
عند استدعائه. تذكر أنWebCustomer
الفئة بدأت مع@Container
تعليق توضيحي يحددcontainerName
كWebCustomers
. منذfindByFirstName
إرجاعFlux<WebCustomer>
، يعرف Spring Data الاستعلامWebCustomers
عند استدعاء هذا الأسلوب.نسخ ولصق التعليمات البرمجية التالية إلى الأسلوب
run
الخاص بك قبل استدعاءdeleteWebCustomerDocument
.logger.info("Running derived query..."); Flux<WebCustomer> webCustomers = reactiveWebCustomerRepository.findByFirstName("Max"); webCustomers.flatMap(webCustomer -> { logger.info("- WebCustomer is : {}", webCustomer.getUserId()); return Mono.empty(); }).blockLast();
في هذا الكود، لاحظ أننا مرة أخرى نستخدم نموذج برمجة تدفق البيانات التعريفي الخاص بـ Project Reactor. نستخدمها هذه المرة لمعالجة صفحات استجابة الاستعلام بشكل غير متزامن. نبرهن على نهج غير متزامن لأنه في حالة استخدام حقيقية، قد يكون هناك مئات أو آلاف من الردود على استعلام ما. يمكن أن يكون تجميع استجابات الاستعلام مهمة مكثفة لوحدة المعالجة المركزية تستفيد من زيادة كفاءة مؤشر الترابط في البرمجة غير المتزامنة.
باختصار، نريد معدل نقل عاليًا من معالجة استجابات الاستعلام أو استجابات عالية/ثانية لكل مؤشر ترابط.
findByFirstName
إرجاع المثيلFlux<WebCustomer>
webCustomers
. يعمل مسار العمليات داخل.flatMap( ... ).blockLast();
بشكل غير متزامن وبالتوازي الزائف على استجابات الاستعلام المرتبطة بكل حدث منبعثة منFlux<WebCustomer>
.إنشاء وتشغيل CosmosSample.java في IDE، أو تشغيل البرنامج في المحطة الطرفية باستخدام:
mvn clean package mvn spring-boot:run
في الوحدة الطرفية، يجب أن يبدو الإخراج شيئًا من هذا القبيل:
INFO: - WebCustomer is : maxaxam
إنشاء واستدعاء أساليب الاستعلام المخصصة
أساليب الاستعلام المخصصة هي أساليب مستودع Spring Data مع @Query
تعليق توضيحي يحدد سلسلة استعلام - وتحتوي سلسلة الاستعلام على عناصر نائبة لوسائط الأسلوب. هذه المرة، لا يؤثر اسم الأسلوب على الاستعلام الذي يتم إجراؤه.
@Query
يشير التعليق التوضيحي إلى Spring Data لإصدار استعلام لغة SQL إلى قاعدة البيانات الأساسية ، بعد ملء العناصر النائبة للوسيطة بقيم وسيطات الأسلوب.
سنقوم بإنشاء أسلوب استعلام مخصص يستعلم عن جميع المستندات التي لها قيمة معينة للحقل
lastName
. انتقل إلى ReactiveWebCustomerRepository.java. سترى إعلان الأسلوب التالي:@Query(value = "SELECT * FROM User WHERE User.lastName = @lastName") Flux<WebCustomer> findByLastName(@Param("lastName") String lastName);
يعلن أسلوب المستودع هذا ل Spring Data أنك تريد أسلوبا يستعلم عنه
lastName
عند استدعائه.lastName
سيتم استبدال قيمة الوسيطة بالعن@lastName
العنصر النائب.انسخ التعليمات البرمجية التالية والصقها في الأسلوب الخاص بك
run
، بعد التعليمات البرمجية للاستعلام المشتق.logger.info("Running custom query..."); webCustomers = reactiveWebCustomerRepository.findByLastName("Axam"); webCustomers.flatMap(webCustomer -> { logger.info("- WebCustomer is : {}", webCustomer.getUserId()); return Mono.empty(); }).blockLast();
إنشاء وتشغيل CosmosSample.java في IDE، أو تشغيل البرنامج في المحطة الطرفية باستخدام:
mvn clean package mvn spring-boot:run
في الوحدة الطرفية، يجب أن يبدو الإخراج شيئًا من هذا القبيل:
INFO: Running derived query... INFO: - WebCustomer is : maxaxam INFO: Running custom query... INFO: - WebCustomer is : maxaxam
في هذه الوحدة، تعرفت على الاستعلامات المشتقة والمخصصة. ثم قمت بإضافة كلا النوعين الاستعلام إلى التطبيق الخاص بك لاسترداد سجلات المستخدم.