Azure Cosmos DB Java SDK v4 (3)

このエントリは2020/06/25現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容との乖離が発生する可能性があります。

以前、Cosmos DBのJava SDK v4について以下の2個のエントリを記載した。

Azure Cosmos DB Java SDK v4 (1)
https://logico-jp.io/2019/11/07/azure-cosmos-db-java-sdk-v4-1/
Azure Cosmos DB Java SDK v4 (2)
https://logico-jp.io/2020/03/31/azure-cosmos-db-java-sdk-v4-2/

今回は、以下のエントリにあるように、これまでJava SDKで出来なかったSelect Distinctを試してみる。これまでは、DISTINCTをサポートしていなかったのでクライアント側で仕分けする必要があった。

Azure Cosmos DB Java SDK v4 – General Availability
https://devblogs.microsoft.com/cosmosdb/java-sdk-v4-ga/

例えば以下のようなデータが格納されているコンテナーCONTAINERがあるとする。

[
    {
        "id": "111",
        "name": "Test1",
        "country": "US",
        "description": "test description1"
    },
    {
        "id": "222",
        "name": "Test2",
        "country": "CA",
        "description": "test description2"
    },
    {
        "id": "333",
        "name": "Test3",
        "country": "JP",
        "description": "test description3"
    },
    {
        "id": "444",
        "name": "Test4",
        "country": "JP",
        "description": "test description4"
    },
    {
        "id": "555",
        "name": "Test5",
        "country": "US",
        "description": "test description5"
    },
    {
        "id": "666",
        "name": "Test6",
        "country": "CA",
        "description": "test description6"
    }
]

このコンテナーに対し、

select distinct c.country from CONTAINER c

というDMLを CosmosContainer#queryItems() もしくは CosmosAsyncContainer#queryItems() で投げてみる。当然ながら、Azure Portalから実行すると、以下のような結果が得られる。

SDKでは以下のような感じ。エンティティクラスとしてPeopleというクラスを使っている。

String sql = "select distinct c.country from " + CONTAINER + " c";

// 同期の場合
CosmosPagedIterable<People> 
fp = cosmosContainer.queryItems(sql, new CosmosQueryRequestOptions(), People.class);
fp.stream().forEach(p -> logger.info("Query result: [Country] " + p.getCountry()));


// 非同期の場合
CosmosPagedFlux<People> res = cosmosAsyncContainer.queryItems(sql, cosmosQueryRequestOptions, People.class);
res.byPage().flatMap(f -> {
    f.getResults().stream().forEach(p ->
            logger.info("Query result:[Country] " + p.getCountry())
    );
    return Flux.empty();
}).blockLast();

結果は以下の通り。当然US、CA、JPが取得できる。APIの違いで結果が変わるわけもない。

同期APIを利用した場合
非同期APIを利用した場合

v4への移行

その他、移行やTipsなどは以下のドキュメントを参照(2020/06/25現在、各ドキュメントは日本語版がまだ最新ではない。今後英語版の記述に追随するはず)。

SQL API アカウントで Azure Cosmos DB Java SDK v4 を使用する場合の問題のトラブルシューティング / Troubleshoot issues when you use Azure Cosmos DB Java SDK v4 with SQL API accounts
https://docs.microsoft.com/azure/cosmos-db/troubleshoot-java-sdk-v4-sql
Azure Cosmos DB Java SDK v4 を使用するようにアプリケーションを移行する / Migrate your application to use the Azure Cosmos DB Java SDK v4
https://docs.microsoft.com/azure/cosmos-db/migrate-java-v4-sdk?tabs=java-v4-async

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中