#32906: Explain JSONBAgg benefit
--------------------------------------+------------------------------------
Reporter: Claude Paroz | Owner: Abhyudai
Type: Cleanup/optimization | Status: assigned
Component: Documentation | Version: dev
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
--------------------------------------+------------------------------------
Comment (by Abhyudai):
Replying to [comment:1 Mariusz Felisiak]:
> I don't think there is a significant difference between them.
`ARRAY_AGG()` returns array and `JSONB_AGG()` return JSON array, so when
you aggregate `JSONField`s with `JSONBAgg()` then you can use key and
index transforms which don't work with `ArrayAgg()` annotations.
As far I can see, they both are giving the same results.
{{{#!python
# model
class AggregateTestModel(PostgreSQLModel):
"""
To test postgres-specific general aggregation functions
"""
json_field = models.JSONField(null=True)
}}}
{{{#!sh
# shell
>>> AggreTestModel.objects.bulk_create(
AggregateTestModel(json_field={'lang': 'pl'}),
AggregateTestModel(json_field={'lang': 'en'}),
AggregateTestModel(json_field={'breed': 'collie'})
)
>>> AggregateTestModel.objects.all().values_list('json_field', flat=True)
<QuerySet [None, {'lang': 'pl'}, {'lang': 'en'}, {'breed': 'collie'}]>
>>> AggregateTestModel.objects.aggregate(val=JSONBAgg('json_field'))
{'val': [None, {'lang': 'pl'}, {'lang': 'en'}, {'breed': 'collie'}]}
>>> jsonb =
AggregateTestModel.objects.aggregate(val=JSONBAgg('json_field'))
>>> jsonb
{'val': [None, {'lang': 'pl'}, {'lang': 'en'}, {'breed': 'collie'}]}
>>> arr = AggregateTestModel.objects.aggregate(val=ArrayAgg('json_field'))
>>> arr
{'val': [None, {'lang': 'pl'}, {'lang': 'en'}, {'breed': 'collie'}]}
>>> arr == jsonb
True
>>> type(arr)
<class 'dict'>
>>> type(jsonb)
<class 'dict'>
}}}
Am I missing something here? The above snippet is just an abstracted
version of the model inside the package `postgres_tests.models`, used for
tests.
--
Ticket URL: <https://code.djangoproject.com/ticket/32906#comment:5>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/065.64f6fb84323ae8c89b592f641cb3f1fe%40djangoproject.com.