--- title: Aggregate Syntax description: Accelerate aggregates with the ParadeDB index canonical: https://docs.paradedb.com/documentation/aggregates/overview --- The `pdb.agg` function accepts an Elasticsearch-compatible JSON aggregate query string. It executes the aggregate using the [columnar](/welcome/architecture#columnar-index) portion of the ParadeDB index, which can significantly accelerate performance compared to vanilla Postgres. For example, the following query counts the total number of results for a search query. ```sql SQL SELECT pdb.agg('{"value_count": {"field": "id"}}') FROM mock_items WHERE category === 'electronics'; ``` ```python Django from paradedb import Agg, ParadeDB, Term MockItem.objects.filter( category=ParadeDB(Term('electronics')) ).aggregate(agg=Agg('{"value_count": {"field": "id"}}')) ``` ```ruby Rails MockItem.search(:category) .term("electronics") .facets_agg(agg: ParadeDB::Aggregations.value_count(:id)) ``` ```ini Expected Response agg ---------------- {"value": 5.0} (1 row) ``` This query counts the number of results for every distinct group: ```sql SQL SELECT rating, pdb.agg('{"value_count": {"field": "id"}}') FROM mock_items WHERE category === 'electronics' GROUP BY rating ORDER BY rating LIMIT 5; ``` ```python Django from paradedb import Agg, ParadeDB, Term MockItem.objects.filter( category=ParadeDB(Term('electronics')) ).values('rating').annotate( agg=Agg('{"value_count": {"field": "id"}}') ).order_by('rating')[:5] ``` ```ruby Rails MockItem.search(:category) .term("electronics") .aggregate_by( :rating, agg: ParadeDB::Aggregations.value_count(:id) ) .order(:rating) .limit(5) ``` ```ini Expected Response rating | agg --------+---------------- 3 | {"value": 1.0} 4 | {"value": 3.0} 5 | {"value": 1.0} (3 rows) ``` ## Multiple Aggregations To compute multiple aggregations at once, simply include multiple `pdb.agg` functions in the target list: ```sql SQL SELECT pdb.agg('{"avg": {"field": "rating"}}') AS avg_rating, pdb.agg('{"value_count": {"field": "id"}}') AS count FROM mock_items WHERE category === 'electronics'; ``` ```python Django from paradedb import Agg, ParadeDB, Term MockItem.objects.filter( category=ParadeDB(Term('electronics')) ).aggregate( avg_rating=Agg('{"avg": {"field": "rating"}}'), count=Agg('{"value_count": {"field": "id"}}'), ) ``` ```ruby Rails MockItem.search(:category) .term("electronics") .facets_agg( avg_rating: ParadeDB::Aggregations.avg(:rating), count: ParadeDB::Aggregations.value_count(:id) ) ``` ```ini Expected Response avg_rating | count ----------------+---------------- {"value": 4.0} | {"value": 5.0} (1 row) ``` ## Performance Optimization On every query, ParadeDB runs checks to ensure that deleted or updated-away rows are not factored into the result set. If your table is not frequently updated or you can tolerate an approximate result, the performance of aggregate queries can be improved by disabling these visibility checks. To do so, set the second argument of `pdb.agg` to `false`. ```sql SQL SELECT pdb.agg('{"value_count": {"field": "id"}}', false) FROM mock_items WHERE description ||| 'running shoes'; ``` ```python Django from paradedb import Agg, Match, ParadeDB MockItem.objects.filter( description=ParadeDB(Match('running shoes', operator='OR')) ).aggregate( agg=Agg('{"value_count": {"field": "id"}}', exact=False) ) ``` ```ruby Rails MockItem.search(:description) .matching_any("running shoes") .facets_agg(exact: false, agg: ParadeDB::Aggregations.value_count(:id)) ``` Disabling this check can improve query times by 2-4x in some cases (at the expense of correctness). If a single query contains multiple `pdb.agg` calls, all of them must use the same visibility setting (either all `true` or all `false`). ## JSON Fields If `metadata` is a JSON field with key `color`, use `metadata.color` as the field name: ```sql SQL SELECT pdb.agg('{"terms": {"field": "metadata.color"}}') FROM mock_items WHERE id @@@ pdb.all(); ``` ```python Django from paradedb import Agg, All, ParadeDB MockItem.objects.filter( id=ParadeDB(All()) ).aggregate(agg=Agg('{"terms": {"field": "metadata.color"}}')) ``` ```ruby Rails MockItem.search(:id) .match_all .facets_agg(agg: ParadeDB::Aggregations.terms("metadata.color")) ``` If a text or JSON field is used inside `pdb.agg`, it must use the [literal](/documentation/tokenizers/available-tokenizers/literal) or [literal normalized](/documentation/tokenizers/available-tokenizers/literal-normalized) tokenizer.