---
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)
```
## 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.