このエントリは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の違いで結果が変わるわけもない。


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