التمرين - الاستعلام باستخدام Azure Cosmos DB Java SDK

مكتمل

الآن بعد أن قمت بإنشاء مستندات في التطبيق الخاص بك، لنستعلم عنها من التطبيق الخاص بك. يستخدم Azure Cosmos DB Java SDK استعلامات SQL. لدى SDK.NET دعم إضافي لاستعلامات LINQ ولكن SDK Java لا يوجد تماثل. تركز هذه الوحدة على تشغيل استعلامات SQL من التطبيق الخاص بك، بدلاً من المدخل.

سنستخدم مستندات المستخدم التي أنشأتها لتطبيق متاجر التجزئة عبر الإنترنت لاختبار هذه الاستعلامات.

تشغيل استعلامات SQL

  1. يوضح النموذج التالي كيف يمكن إجراء استعلام في 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 إرجاع المثيل CosmosPagedFluxpagedFluxResponse، وإنشاء pagedFluxResponse.byPage(preferredPageSize)Flux مثيل مصدر لأحداث الصفحة غير المتزامنة. يعمل مسار العمليات داخل .flatMap( ... ).blockLast(); بشكل غير متزامن وبالتوازي الزائف في صفحة استجابة الاستعلام المقترنة بكل حدث منبعثة من المثيل Flux .

  2. نسخ ولصق التعليمات البرمجية التالية إلى الأسلوب basicOperations الخاص بك قبل التعليمة البرمجية لحذف المستند.

    executeSimpleQuery("SELECT * FROM User WHERE User.lastName = 'Pindakova'");
    
  3. إنشاء وتشغيل 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. في هذا القسم، سوف نعرض كيفية تطبيق أساليب الاستعلام المشتقة الجديدة.

  1. سننشئ أسلوب استعلام مشتق يستعلم عن جميع المستندات التي لها قيمة معينة للحقل firstName . انتقل إلى ReactiveWebCustomerRepository.java. سترى إعلان الأسلوب التالي:

    Flux<WebCustomer> findByFirstName(String firstName);
    

    يعلن أسلوب المستودع هذا ل Spring Data أنك تريد أسلوبا يستعلم عنه firstName عند استدعائه. تذكر أن WebCustomer الفئة بدأت مع @Container تعليق توضيحي يحدد containerName ك WebCustomers. منذ findByFirstName إرجاع Flux<WebCustomer>، يعرف Spring Data الاستعلام WebCustomers عند استدعاء هذا الأسلوب.

  2. نسخ ولصق التعليمات البرمجية التالية إلى الأسلوب 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>.

  3. إنشاء وتشغيل CosmosSample.java في IDE، أو تشغيل البرنامج في المحطة الطرفية باستخدام:

    mvn clean package
    mvn spring-boot:run
    

    في الوحدة الطرفية، يجب أن يبدو الإخراج شيئًا من هذا القبيل:

    INFO: - WebCustomer is : maxaxam
    

إنشاء واستدعاء أساليب الاستعلام المخصصة

أساليب الاستعلام المخصصة هي أساليب مستودع Spring Data مع @Query تعليق توضيحي يحدد سلسلة استعلام - وتحتوي سلسلة الاستعلام على عناصر نائبة لوسائط الأسلوب. هذه المرة، لا يؤثر اسم الأسلوب على الاستعلام الذي يتم إجراؤه. @Queryيشير التعليق التوضيحي إلى Spring Data لإصدار استعلام لغة SQL إلى قاعدة البيانات الأساسية ، بعد ملء العناصر النائبة للوسيطة بقيم وسيطات الأسلوب.

  1. سنقوم بإنشاء أسلوب استعلام مخصص يستعلم عن جميع المستندات التي لها قيمة معينة للحقل lastName . انتقل إلى ReactiveWebCustomerRepository.java. سترى إعلان الأسلوب التالي:

    @Query(value = "SELECT * FROM User WHERE User.lastName = @lastName")
    Flux<WebCustomer> findByLastName(@Param("lastName") String lastName);
    

    يعلن أسلوب المستودع هذا ل Spring Data أنك تريد أسلوبا يستعلم عنه lastName عند استدعائه. lastName سيتم استبدال قيمة الوسيطة بالعن @lastName العنصر النائب.

  2. انسخ التعليمات البرمجية التالية والصقها في الأسلوب الخاص بك run ، بعد التعليمات البرمجية للاستعلام المشتق.

    logger.info("Running custom query...");
    webCustomers = reactiveWebCustomerRepository.findByLastName("Axam");
    webCustomers.flatMap(webCustomer -> {
        logger.info("- WebCustomer is : {}", webCustomer.getUserId());
        return Mono.empty();
    }).blockLast();
    
  3. إنشاء وتشغيل 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    
    

في هذه الوحدة، تعرفت على الاستعلامات المشتقة والمخصصة. ثم قمت بإضافة كلا النوعين الاستعلام إلى التطبيق الخاص بك لاسترداد سجلات المستخدم.