Tablestore SDK for Java を使用して、メトリックの計算や多次元インデックスのクエリ結果のグループ化ができます。これには、ヒストグラム、ネストされたグループ化、グループ内の上位行の使用などが含まれます。
前提条件
Tablestore Java SDK をインストールし、クライアントを初期化します。
仕組み
多次元インデックスのクエリが完了した後、集約はメトリックを計算するか、一致するすべての行をグループ化します。メトリック集約は、フィールドの最小値、最大値、合計、平均値、カウント、個別カウント、またはパーセンタイルを計算します。グループ化は、フィールド値、複数フィールド、数値範囲、地理的距離、フィルター、数値間隔、日付間隔、または地理的グリッドによって行をグループ化します。また、グループ内にメトリック集約やグループ化を追加することもできます。
|
カテゴリ |
構成タイプ |
説明 |
|
メトリック集約 |
MinAggregation |
フィールドの最小値を返します。SQL の |
|
メトリック集約 |
MaxAggregation |
フィールドの最大値を返します。SQL の |
|
メトリック集約 |
SumAggregation |
数値フィールドの合計を返します。SQL の |
|
メトリック集約 |
AvgAggregation |
フィールドの平均値を返します。SQL の |
|
メトリック集約 |
CountAggregation |
指定されたフィールドに値を持つ行の数を返します。SQL の |
|
メトリック集約 |
DistinctCountAggregation |
フィールド内の一意な値の数を返します。SQL の |
|
メトリック集約 |
PercentilesAggregation |
フィールドの 1 つ以上のパーセンタイルを返します。 |
|
メトリック集約 |
TopRowsAggregation |
指定された順序に基づいて、各グループの最初の数行を返します。 |
|
グループ化 |
GroupByField |
1 つのフィールドの値で行をグループ化します。 |
|
グループ化 |
GroupByComposite |
複数のフィールドで行をグループ化し、ページネーショントークンをサポートします。 |
|
グループ化 |
GroupByRange |
数値範囲で行をグループ化します。 |
|
グループ化 |
GroupByGeoDistance |
中心点からの距離範囲で行をグループ化します。 |
|
グループ化 |
GroupByFilter |
複数のフィルターで行をグループ化します。 |
|
グループ化 |
GroupByHistogram |
固定の数値間隔を使用してヒストグラムを作成します。 |
|
グループ化 |
GroupByDateHistogram |
固定の日付または時間間隔を使用してヒストグラムを作成します。 |
|
グループ化 |
GroupByGeoGrid |
GeoHash グリッドで行をグループ化します。 |
集約で使用される多次元インデックスフィールドに対して、ソートと集約を有効にする必要があります。サポートされるフィールドタイプは集約タイプによって異なります。多次元インデックスのフィールドタイプとデータテーブルのフィールドタイプとのマッピングについては、「データ型」をご参照ください。
集約はクエリに一致した結果に対して操作を行います。集約を含むリクエストは、行をクエリするだけのリクエストよりも複雑です。応答に行が必要ない場合は、
limitを0に設定します。個別カウント、パーセンタイル、フィールドのグループ化では近似計算が使用されます。10,000 未満の個別カウントは正確な値に近くなります。個別カウントが 1 億の場合、誤差は約 2% です。両端に近いパーセンタイルは通常、より正確です。たとえば、P1 と P99 は通常 P50 よりも正確です。フィールドのグループ化の並列計算も、わずかな誤差を生じさせる可能性があります。
複数の集約を組み合わせることができます。多数の集約や深いネストはリクエストの複雑さを増し、レイテンシを増加させる可能性があります。ネストの制限については、「多次元インデックスの制限事項」をご参照ください。
search を呼び出してデータをクエリします。メトリック集約には SearchQuery.aggregationList を、グループ化には SearchQuery.groupByList を構成します。
SearchResponse search(SearchRequest request)
次の例では、多次元インデックス内のすべての行をクエリし、価格の最小値、最大値、合計、平均値、カウント、個別カテゴリ数、および P50 を計算し、カテゴリごとに行をグループ化します。
SearchQuery searchQuery = SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addAggregation(AggregationBuilders.min("min_price", "price"))
.addAggregation(AggregationBuilders.max("max_price", "price"))
.addAggregation(AggregationBuilders.sum("sum_price", "price"))
.addAggregation(AggregationBuilders.avg("avg_price", "price"))
.addAggregation(AggregationBuilders.count("price_count", "price"))
.addAggregation(AggregationBuilders.distinctCount(
"category_count", "category"))
.addAggregation(AggregationBuilders.percentiles(
"price_percentiles", "price")
.percentiles(Arrays.asList(50.0)))
.addGroupBy(GroupByBuilders.groupByField(
"category_group", "category").size(10))
.build();
SearchRequest request =
new SearchRequest("example_table", "example_index", searchQuery);
SearchResponse response = client.search(request);
AggregationResults aggregationResults = response.getAggregationResults();
System.out.println(aggregationResults
.getAsMinAggregationResult("min_price").getValue());
System.out.println(aggregationResults
.getAsMaxAggregationResult("max_price").getValue());
System.out.println(aggregationResults
.getAsSumAggregationResult("sum_price").getValue());
System.out.println(aggregationResults
.getAsAvgAggregationResult("avg_price").getValue());
System.out.println(aggregationResults
.getAsCountAggregationResult("price_count").getValue());
System.out.println(aggregationResults
.getAsDistinctCountAggregationResult("category_count").getValue());
System.out.println(aggregationResults
.getAsPercentilesAggregationResult("price_percentiles")
.getPercentilesAggregationItems());
GroupByFieldResult groupResult = response.getGroupByResults()
.getAsGroupByFieldResult("category_group");
for (GroupByFieldResultItem item :
groupResult.getGroupByFieldResultItems()) {
System.out.println(item.getKey() + ": " + item.getRowCount());
}
パラメーター
クエリリクエスト
request の型は SearchRequest です。次の表に、そのパラメーターを示します。
|
名前 |
型 |
説明 |
|
tableName (必須) |
String |
データテーブルの名前。 |
|
indexName (必須) |
String |
検索インデックスの名前 |
|
searchQuery (必須) |
SearchQuery |
クエリ条件と集約構成。 |
|
columnsToGet (オプション) |
SearchRequest.ColumnsToGet |
返す列。このパラメーターは、 |
|
timeoutInMillisecond (オプション) |
int |
リクエストレベルのクエリタイムアウト (ミリ秒単位)。デフォルト値: |
|
routingValues (オプション) |
|
カスタムルーティングフィールドのプライマリキー値。カスタムルーティングを使用しない場合は、このパラメーターを構成する必要はありません。 |
クエリ構成
request.searchQuery の型は SearchQuery です。次の表に、集約に関連するパラメーターを示します。
|
名前 |
型 |
説明 |
|
query (必須) |
Query |
集約範囲を決定するクエリ条件。多次元インデックス内のすべての行を集約するには、 |
|
aggregationList (オプション) |
|
メトリック集約の構成。このパラメーターと |
|
groupByList (オプション) |
|
グループ化の構成。このパラメーターと |
|
limit (オプション) |
Integer |
返す行の最大数。デフォルト値: |
|
offset (オプション) |
Integer |
クエリを開始する行の位置。デフォルト値: |
|
sort (オプション) |
Sort |
クエリ結果のソート順。このパラメーターは、メトリック集約または通常のグループ化の範囲を変更しません。 |
|
trackTotalCount (オプション) |
int |
カウントする一致行の予想最大数。このパラメーターが |
|
filter (オプション) |
SearchFilter |
|
メトリック集約
次のパラメーターオブジェクトを request.searchQuery.aggregationList[] に追加します。aggName は対応する結果を識別し、リクエスト内で一意である必要があります。
MinAggregation、MaxAggregation、および AvgAggregation
|
名前 |
型 |
説明 |
|
aggName (必須) |
String |
集約の名前。 |
|
fieldName (必須) |
String |
集約フィールドの名前。Long、Double、および Date フィールドがサポートされています。 |
|
missing (オプション) |
ColumnValue |
|
SumAggregation
|
名前 |
型 |
説明 |
|
aggName (必須) |
String |
集約の名前。 |
|
fieldName (必須) |
String |
集約フィールドの名前。Long および Double フィールドがサポートされています。 |
|
missing (オプション) |
ColumnValue |
|
CountAggregation
|
名前 |
型 |
説明 |
|
aggName (必須) |
String |
集約の名前。 |
|
fieldName (必須) |
String |
null 以外の値がカウントされるフィールド。Long、Double、Boolean、Keyword、Date、IP、および Geo-point フィールドがサポートされています。スパース列でフィールドを含まない行はカウントされません。 |
クエリに一致するすべての行をカウントするには、SearchQuery で trackTotalCount を構成し、SearchResponse.totalCount を読み取ります。多次元インデックス内のすべての行をカウントするには、MatchAllQuery を使用します。
DistinctCountAggregation
|
名前 |
型 |
説明 |
|
aggName (必須) |
String |
集約の名前。 |
|
fieldName (必須) |
String |
一意な値がカウントされるフィールド。Long、Double、Boolean、Keyword、Date、IP、および Geo-point フィールドがサポートされています。 |
|
missing (オプション) |
ColumnValue |
|
PercentilesAggregation
|
名前 |
型 |
説明 |
|
aggName (必須) |
String |
集約の名前。 |
|
fieldName (必須) |
String |
集約フィールドの名前。Long、Double、および Date フィールドがサポートされています。 |
|
percentiles (必須) |
|
計算するパーセンタイル。例: |
|
missing (オプション) |
ColumnValue |
|
TopRowsAggregation
TopRowsAggregation をグループ化のサブ集約として使用します。
|
名前 |
型 |
説明 |
|
aggName (必須) |
String |
集約の名前。 |
|
limit (オプション) |
Integer |
各グループから返す行の最大数。デフォルト値: |
|
sort (オプション) |
Sort |
グループ内の行のソート順。 |
request.columnsToGet パラメーターは、返される属性列をコントロールします。多次元インデックスから属性列を直接返すには、多次元インデックスを作成するときにフィールドを保存します。列が指定されていない場合、プライマリキーのみが返されます。
グループ化
次のパラメーターオブジェクトを request.searchQuery.groupByList[] に追加します。groupByName は対応する結果を識別し、リクエスト内で一意である必要があります。
GroupByField
|
名前 |
型 |
説明 |
|
groupByName (必須) |
String |
グループ化の名前。 |
|
fieldName (必須) |
String |
グループ化フィールドの名前。Long、Double、Boolean、Keyword、Date、および IP フィールドがサポートされています。 |
|
size (オプション) |
Integer |
返すグループの数。デフォルト値: |
|
minDocCount (オプション) |
Long |
グループ内の最小行数。行数が少ないグループは返されません。 |
|
groupBySorters (オプション) |
|
グループのソートルール。デフォルトでは、グループは行数の降順でソートされます。複数のルールは追加された順に有効になります。 |
|
subAggregations (オプション) |
|
各グループ内で計算されるメトリック集約。 |
|
subGroupBys (オプション) |
|
各親グループ内で適用されるグループ化。 |
groupBySorters[] は次の値をサポートします。
|
値 |
説明 |
|
groupKeySortInAsc |
グループをキーの辞書順の昇順でソートします。 |
|
groupKeySortInDesc |
グループをキーの辞書順の降順でソートします。 |
|
rowCountSortInAsc |
グループを行数の昇順でソートします。 |
|
rowCountSortInDesc |
グループを行数の降順でソートします。これがデフォルトです。 |
|
subAggSortInAsc |
指定されたサブ集約の値の昇順でグループをソートします。 |
|
subAggSortInDesc |
指定されたサブ集約の値の降順でグループをソートします。 |
GroupByComposite
|
名前 |
型 |
説明 |
|
groupByName (必須) |
String |
グループ化の名前。 |
|
sources (必須) |
|
複数フィールドのグループ化ソース。最大 32 フィールドがサポートされています。ソースは |
|
nextToken (オプション) |
String |
次のグループページのページネーショントークン。最初のリクエストではこのパラメーターを省略します。応答の |
|
size (オプション) |
Integer |
返すグループの数。デフォルト値: |
|
suggestedSize (オプション) |
Integer |
Spark や Presto などのコンピュートエンジンとの高スループット統合のためのソフトリミット。このパラメーターを |
|
subAggregations (オプション) |
|
サブ集約。 |
|
subGroupBys (オプション) |
|
サブグループ化。 |
Tablestore SDK for Java は nextToken を文字列として表します。トークンを永続化または転送する場合、その内容を変更しないでください。
GroupByRange
|
名前 |
型 |
説明 |
|
groupByName (必須) |
String |
グループ化の名前。 |
|
fieldName (必須) |
String |
グループ化フィールドの名前。Long および Double フィールドがサポートされています。 |
|
ranges (必須) |
|
範囲。各範囲は左閉じ右開きです: |
|
subAggregations (オプション) |
|
サブ集約。 |
|
subGroupBys (オプション) |
|
サブグループ化。 |
GroupByGeoDistance
|
名前 |
型 |
説明 |
|
groupByName (必須) |
String |
グループ化の名前。 |
|
fieldName (必須) |
String |
グループ化フィールドの名前。Geo-point フィールドのみがサポートされています。 |
|
origin (必須) |
GeoPoint |
中心点。コンストラクターのパラメーターは緯度、経度の順です。緯度の範囲は |
|
ranges (必須) |
|
距離範囲 (メートル単位)。各範囲は左閉じ右開きです: |
|
subAggregations (オプション) |
|
サブ集約。 |
|
subGroupBys (オプション) |
|
サブグループ化。 |
GroupByFilter
|
名前 |
型 |
説明 |
|
groupByName (必須) |
String |
グループ化の名前。 |
|
filters (必須) |
|
フィルター。結果はフィルターが追加された順に返されます。 |
|
subAggregations (オプション) |
|
サブ集約。 |
|
subGroupBys (オプション) |
|
サブグループ化。 |
GroupByHistogram
|
名前 |
型 |
説明 |
|
groupByName (必須) |
String |
グループ化の名前。 |
|
fieldName (必須) |
String |
グループ化フィールドの名前。Long および Double フィールドがサポートされています。 |
|
interval (必須) |
ColumnValue |
ヒストグラムの間隔。 |
|
fieldRange (オプション) |
FieldRange |
集約範囲。 |
|
offset (オプション) |
ColumnValue |
デフォルトの開始点からのバケット境界のオフセット。 |
|
minDocCount (オプション) |
Long |
バケット内の最小行数。行数が少ないバケットは返されません。 |
|
missing (オプション) |
ColumnValue |
|
|
groupBySorters (オプション) |
|
バケットのソートルール。 |
|
subAggregations (オプション) |
|
サブ集約。 |
|
subGroupBys (オプション) |
|
サブグループ化。 |
GroupByDateHistogram
日付ヒストグラム集約は、Tablestore SDK for Java 5.16.1 以降でサポートされています。多次元インデックスの Date フィールドタイプは、Tablestore SDK for Java 5.13.9 以降でサポートされています。バージョン情報については、「Tablestore SDK for Java のバージョン履歴」をご参照ください。
|
名前 |
型 |
説明 |
|
groupByName (必須) |
String |
グループ化の名前。 |
|
fieldName (必須) |
String |
グループ化フィールドの名前。Date フィールドのみがサポートされています。 |
|
interval (必須) |
DateTimeValue |
日付または時間の間隔。値と |
|
fieldRange (オプション) |
FieldRange |
集約範囲。 |
|
minDocCount (オプション) |
Long |
バケット内の最小行数。行数が少ないバケットは返されません。 |
|
missing (オプション) |
ColumnValue |
|
|
timeZone (オプション) |
String |
|
|
groupBySorters (オプション) |
|
バケットのソートルール。 |
|
subAggregations (オプション) |
|
サブ集約。 |
|
subGroupBys (オプション) |
|
サブグループ化。 |
GroupByGeoGrid
|
名前 |
型 |
説明 |
|
groupByName (必須) |
String |
グループ化の名前。 |
|
fieldName (必須) |
String |
グループ化フィールドの名前。Geo-point フィールドのみがサポートされています。 |
|
precision (必須) |
GeoHashPrecision |
GeoHash グリッドの精度。値の範囲は、約 5,009 km × 4,992 km の |
|
size (オプション) |
Integer |
返すグリッドグループの数。 |
|
subAggregations (オプション) |
|
サブ集約。 |
|
subGroupBys (オプション) |
|
サブグループ化。 |
応答
search メソッドは SearchResponse を返します。次の表に、集約に関連するフィールドを示します。
|
名前 |
型 |
説明 |
|
aggregationResults |
AggregationResults |
メトリック集約の結果。 |
|
groupByResults |
GroupByResults |
グループ化の結果。 |
|
totalCount |
long |
クエリに一致した数。 |
|
isAllSuccess |
boolean |
すべてのインデックスパーティションがクエリされたかどうかを示します。 |
メトリック集約の結果
|
構成タイプ |
結果の型 |
結果フィールドとアクセサー |
|
MinAggregation |
MinAggregationResult |
|
|
MaxAggregation |
MaxAggregationResult |
|
|
SumAggregation |
SumAggregationResult |
|
|
AvgAggregation |
AvgAggregationResult |
|
|
CountAggregation |
CountAggregationResult |
|
|
DistinctCountAggregation |
DistinctCountAggregationResult |
|
|
PercentilesAggregation |
PercentilesAggregationResult |
|
|
TopRowsAggregation |
TopRowsAggregationResult |
|
グループ化の結果
|
構成タイプ |
結果の型 |
コア結果フィールド |
|
GroupByField |
GroupByFieldResult |
|
|
GroupByComposite |
GroupByCompositeResult |
|
|
GroupByRange |
GroupByRangeResult |
|
|
GroupByGeoDistance |
GroupByGeoDistanceResult |
|
|
GroupByFilter |
GroupByFilterResult |
|
|
GroupByHistogram |
GroupByHistogramResult |
|
|
GroupByDateHistogram |
GroupByDateHistogramResult |
|
|
GroupByGeoGrid |
GroupByGeoGridResult |
|
例
サブ集約とサブグループ化の使用
次の例では、カテゴリごとに行をグループ化し、各カテゴリの最高価格を計算し、その後、各カテゴリの行を都市ごとにグループ化します。グループのソートルールは追加された順に有効になります。
SearchQuery searchQuery = SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addGroupBy(GroupByBuilders.groupByField(
"category_group", "category")
.size(10)
.addGroupBySorter(GroupBySorter.groupKeySortInAsc())
.addSubAggregation(AggregationBuilders.max(
"max_price", "price"))
.addSubGroupBy(GroupByBuilders.groupByField(
"city_group", "city").size(10)))
.build();
SearchRequest request =
new SearchRequest("example_table", "example_index", searchQuery);
SearchResponse response = client.search(request);
GroupByFieldResult result = response.getGroupByResults()
.getAsGroupByFieldResult("category_group");
for (GroupByFieldResultItem item :
result.getGroupByFieldResultItems()) {
double maxPrice = item.getSubAggregationResults()
.getAsMaxAggregationResult("max_price")
.getValue();
GroupByFieldResult cityResult = item.getSubGroupByResults()
.getAsGroupByFieldResult("city_group");
System.out.println(item.getKey() + ": " + maxPrice);
System.out.println(cityResult.getGroupByFieldResultItems());
}
複数フィールドのグループ化のページネーション
GroupByComposite は、複数列のキーをフラットな構造で返し、nextToken によるページネーションをサポートします。
GroupByComposite.Builder compositeBuilder = GroupByBuilders
.groupByComposite("category_city_group")
.addSources(GroupByBuilders.groupByField(
"category", "category")
.addGroupBySorter(GroupBySorter.groupKeySortInAsc()))
.addSources(GroupByBuilders.groupByField(
"city", "city")
.addGroupBySorter(GroupBySorter.groupKeySortInAsc()))
.size(100);
String nextToken = null;
do {
GroupByComposite groupBy = nextToken == null
? compositeBuilder.build()
: compositeBuilder.nextToken(nextToken).build();
SearchQuery searchQuery = SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addGroupBy(groupBy)
.build();
SearchRequest request = new SearchRequest(
"example_table", "example_index", searchQuery);
SearchResponse response = client.search(request);
GroupByCompositeResult result = response.getGroupByResults()
.getAsGroupByCompositeResult("category_city_group");
for (GroupByCompositeResultItem item :
result.getGroupByCompositeResultItems()) {
System.out.println(item.getKeys() + ": " + item.getRowCount());
}
nextToken = result.getNextToken();
} while (nextToken != null);
範囲、距離、フィルターによるグループ化
次のコードは、3 種類のグループ化のコア構成を示しています。これらを同じ SearchQuery で組み合わせることができます。
GroupByRange priceRanges = GroupByBuilders
.groupByRange("price_ranges", "price")
.addRange(0, 100)
.addRange(100, 500)
.build();
GroupByGeoDistance distanceRanges = GroupByBuilders
.groupByGeoDistance("distance_ranges", "location")
.origin(30.2741, 120.1551)
.addRange(0, 10000)
.addRange(10000, 100000)
.build();
GroupByFilter categoryFilters = GroupByBuilders
.groupByFilter("category_filters")
.addFilter(QueryBuilders.term("category", "books"))
.addFilter(QueryBuilders.term("category", "games"))
.build();
数値および日付ヒストグラムの作成
次の例では、20 の数値間隔と 1 か月の日付間隔で行をグループ化します。
GroupByHistogram priceHistogram = GroupByBuilders
.groupByHistogram("price_histogram", "price")
.interval(20)
.offset(0)
.minDocCount(1L)
.addFieldRange(0, 100)
.addGroupBySorter(GroupBySorter.groupKeySortInAsc())
.build();
GroupByDateHistogram dateHistogram = GroupByBuilders
.groupByDateHistogram("date_histogram", "event_date")
.interval(1, DateTimeUnit.MONTH)
.fieldRange("2026-01-01", "2026-06-01")
.timeZone("+08:00")
.minDocCount(1L)
.addGroupBySorter(GroupBySorter.groupKeySortInAsc())
.build();
SearchQuery searchQuery = SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addGroupBy(priceHistogram)
.addGroupBy(dateHistogram)
.build();
SearchResponse response = client.search(new SearchRequest(
"example_table", "example_index", searchQuery));
地理的グリッドによるグループ化
次の例では、地理的フィールドを約 39 km × 19 km の GeoHash グリッドにグループ化します。
SearchQuery searchQuery = SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addGroupBy(GroupByBuilders.groupByGeoGrid(
"geo_grid", "location")
.precision(GeoHashPrecision.GHP_39KM_19KM_4)
.size(100))
.build();
SearchResponse response = client.search(new SearchRequest(
"example_table", "example_index", searchQuery));
GroupByGeoGridResult result = response.getGroupByResults()
.getAsGroupByGeoGridResult("geo_grid");
System.out.println(result.getGroupByGeoGridResultItems());
グループからの行の返却
次の例では、カテゴリごとに行をグループ化し、各カテゴリで最も価格の高い行を返します。
SearchQuery searchQuery = SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addGroupBy(GroupByBuilders.groupByField(
"category_group", "category")
.size(10)
.addSubAggregation(AggregationBuilders.topRows(
"top_price")
.limit(1)
.sort(new Sort(Arrays.asList(
new FieldSort(
"price", SortOrder.DESC))))))
.build();
SearchRequest.ColumnsToGet columnsToGet =
new SearchRequest.ColumnsToGet();
columnsToGet.setColumns(Arrays.asList("category", "price"));
SearchRequest request =
new SearchRequest("example_table", "example_index", searchQuery);
request.setColumnsToGet(columnsToGet);
SearchResponse response = client.search(request);
GroupByFieldResult result = response.getGroupByResults()
.getAsGroupByFieldResult("category_group");
for (GroupByFieldResultItem item :
result.getGroupByFieldResultItems()) {
List<Row> rows = item.getSubAggregationResults()
.getAsTopRowsAggregationResult("top_price")
.getRows();
System.out.println(item.getKey() + ": " + rows);
}
複数フィールドのグループ化の比較
複数のフィールドでグループ化するには、複数の GroupByField 構成をネストするか、GroupByComposite を直接使用します。ページネーションの要件、応答構造、およびソートルールに基づいて選択します。
|
項目 |
ネストされたフィールドのグループ化 |
複合グループ化 |
|
構成 |
親の |
|
|
グループ数 |
各レベルで最大 2,000 グループ。 |
ページごとに最大 2,000 グループ。 |
|
フィールド数 |
最大 3 つのネストレベル。 |
最大 32 フィールド。 |
|
応答構造 |
親と子のレベルでネストされます。 |
複数列のキーはフラットなリストとして返されます。 |
|
ページネーション |
サポートされていません。 |
|
|
ソート |
グループキー、行数、またはサブ集約の値によるソートをサポートします。 |
各グループ化ソースは、キーによる辞書順のソートのみをサポートします。デフォルトの順序は降順です。 |
|
サブ集約 |
サポートされています。 |
サポートされています。 |
|
Date フィールドの互換性 |
グループキーは、フィールドに定義された日付形式を使用します。 |
日付グループキーはタイムスタンプ文字列として返されます。 |