Use the multiFieldQuery() method to query data stored in the multi-value data model. A single query retrieves multiple fields from the same metric, with independent aggregators and downsampling settings per field.
How it works
Build a query in three steps:
Create one
MultiFieldSubQueryDetailsobject per field. Each specifies the field name, aggregator, and downsampling interval.Create a
MultiFieldSubQuerythat groups the field details under a metric name and applies an optional tag filter.Create a
MultiFieldQuerywith the time range and the subquery, then calltsdb.multiFieldQuery(query).
Query multi-value data
The following example queries three specific fields (speed, level, temperature) and all fields using MAX and MIN aggregators. Results are filtered by the district tag.
// Step 1: Define field-level query details.
// Each MultiFieldSubQueryDetails specifies a field, aggregator, and downsampling interval.
MultiFieldSubQueryDetails speedFieldDetails = MultiFieldSubQueryDetails
.field("speed").aggregator(Aggregator.SUM).downsample("2s-sum").build();
MultiFieldSubQueryDetails levelFieldDetails = MultiFieldSubQueryDetails
.field("level").aggregator(Aggregator.AVG).downsample("2s-avg").build();
MultiFieldSubQueryDetails tempFieldDetails = MultiFieldSubQueryDetails
.field("temperature").aggregator(Aggregator.COUNT).downsample("2s-count").build();
// Use "*" to query all fields. Set an alias to distinguish results when multiple
// wildcard queries are included.
MultiFieldSubQueryDetails allFieldsDetails1 = MultiFieldSubQueryDetails
.field("*").aggregator(Aggregator.MAX).downsample("2s-max").alias("max_").build();
MultiFieldSubQueryDetails allFieldsDetails2 = MultiFieldSubQueryDetails
.field("*").aggregator(Aggregator.MIN).downsample("2s-min").alias("min_").build();
List<MultiFieldSubQueryDetails> subQueryDetails = new LinkedList<>();
subQueryDetails.add(speedFieldDetails);
subQueryDetails.add(levelFieldDetails);
subQueryDetails.add(tempFieldDetails);
subQueryDetails.add(allFieldsDetails1);
subQueryDetails.add(allFieldsDetails2);
// Step 2: Create a subquery for the multi-value data model.
// Specify the metric, the field details list, and an optional tag filter.
MultiFieldSubQuery subQuery = MultiFieldSubQuery.metric(metric).fieldsInfo(subQueryDetails)
.filter(Filter.filter(FilterType.LiteralOr, "district", "Yuhang|Xiacheng|Xihu", true).build())
.build();
// Step 3: Set the time range and run the query.
MultiFieldQuery query = MultiFieldQuery.start(1542772000L).end(1542772020L).msResolution(false)
.sub(subQuery).build();
List<MultiFieldQueryResult> results = tsdb.multiFieldQuery(query);Parameters
MultiFieldSubQueryDetails
| Parameter | Required | Description | Example |
|---|---|---|---|
field | Yes | Field name to query. Use "*" to query all fields. | "speed", "*" |
aggregator | Yes | Aggregation function applied to data points. Example values used in the SDK: SUM, AVG, COUNT, MAX, MIN. | Aggregator.SUM |
downsample | Yes | Downsampling interval and function in <interval><unit>-<function> format. For example, "2s-sum" applies a SUM function over a 2-second interval. | "2s-sum" |
alias | No | Alias prefix for returned field names. Set an alias to distinguish results when multiple wildcard ("*") field queries are included. | "max_" |
MultiFieldSubQueryDetailsalso acceptsdpValueandrateparameters for advanced query scenarios.
MultiFieldSubQuery
| Parameter | Required | Description | Example |
|---|---|---|---|
metric | Yes | The metric to query. | "wind" |
fieldsInfo | Yes | List of MultiFieldSubQueryDetails objects. | See above |
filter | No | Tag filter for narrowing results. Use Filter.filter(FilterType, tagKey, tagValues, groupBy). | FilterType.LiteralOr, "district", "Yuhang|Xiacheng|Xihu", true |
MultiFieldQuery
| Parameter | Required | Description | Example |
|---|---|---|---|
start | Yes | Query start time as a Unix timestamp. | 1542772000L |
end | Yes | Query end time as a Unix timestamp. | 1542772020L |
msResolution | No | Set to true to return timestamps in milliseconds. Set to false to return timestamps in seconds. | false |
sub | Yes | The MultiFieldSubQuery to run. | — |
limit / offset | No | Pagination parameters for large result sets. | — |