Aggregate Functions
The most common use case of grouping queries is to compute some aggregate function over the sub-group. Like the special _group
field, aggregate functions are defined and returned using special fields. These fields prefix the target field name with the name of the aggregate function you wish to apply. If we had the field rating
, we could access the average value of all sub-group ratings by including the special field _avg { rating }
in our return object. The available aggregate functions and their associated scalars can be found above in Table 3
.
The special aggregate function fields' format is the function name and the field name as its sub-elements. Specifically: _$function { $field }
, where $function
is the list of functions from Table 3
, and $field
is the field name to which the function will be applied to. E.g., applying the max
function to the rating
field becomes _max { rating }
.
Let us augment the previous grouped books by genre example and include an aggregate function on the sub-groups ratings.
{
Books(filter: {author: {name: {_like: "John%"}}}, groupBy: [genre]) {
genre
_avg {
rating
points
}
_group {
title
rating
}
}
}
Here we return the average of all the ratings of the books whose authors name begins with "John" grouped by the genres.
We can also use simpler queries, without any groupBy
clause, and still use aggregate functions. The difference is, instead of applying the aggregate function to only the sub-group, it applies it to the entire result set.
Let's simply count all the objects returned by a given filter.
{
_count(Books: {filter: {rating: {_gt: 3.5}}})
}
This returns an array of objects that includes the respective books title, along with the repeated _count
field, which is the total number of objects that match the filter.
Note, the special aggregate field
_count
has no subfields selected, so instead of applying thecount
function to a field, it applies to the entire object. This is only possible with thecount
function; all the other aggregate functions must specify their target field using the correct field name selection.
We can further simplify the above count query by including only the _count
field. If we only return the _count
field, then a single object is returned, instead of an array of objects.
DefraDB also supports applying aggregate functions to relations just like we do fields. However, only the count
function is available directly on the related object type.