Untitled
unknown
plain_text
a year ago
2.1 kB
12
Indexable
To meet your requirements for a fast SQL-based search across all levels of the `scanning_info` JSON field, we can use PostgreSQL's JSON operators and indexing. Here's a solution:
1. First, create a GIN index on the `scanning_info` field:
```sql
CREATE INDEX idx_run_scanning_info ON run USING GIN ((scanning_info) jsonb_path_ops);
```
2. Then, use the following SQL query to search for a given serial number:
```sql
SELECT id FROM run
WHERE scanning_info @> '{"sn": "SEARCH_SN"}'
OR scanning_info @> '{"children": [{"sn": "SEARCH_SN"}]}'
OR scanning_info::jsonb @@ '$.**.sn == "SEARCH_SN"'
```
Replace `SEARCH_SN` with the actual serial number you're searching for.
This query:
- Checks the top-level `sn`
- Checks the first level of children
- Uses JSON path expressions to search all nested levels
To implement this in Django:
1. Add the index in a migration:
```python
from django.contrib.postgres.indexes import GinIndex
class Migration(migrations.Migration):
dependencies = [
('your_app', 'previous_migration'),
]
operations = [
GinIndex(fields=['scanning_info'], name='idx_run_scanning_info', opclass='jsonb_path_ops'),
]
```
2. Create a custom manager method:
```python
from django.db import models
from django.contrib.postgres.fields import JSONField
class RunManager(models.Manager):
def search_by_sn(self, sn):
return self.filter(
models.Q(scanning_info__sn=sn) |
models.Q(scanning_info__children__contains=[{'sn': sn}]) |
models.Q(scanning_info__jsonfield__exact=models.F('scanning_info__jsonfield').text('$.**.sn == "%s"' % sn))
)
class Run(models.Model):
# ... existing fields ...
objects = RunManager()
```
3. Use the custom manager in your API view:
```python
def search_runs(request):
sn = request.GET.get('sn')
runs = Run.objects.search_by_sn(sn).values_list('id', flat=True)
return JsonResponse(list(runs), safe=False)
```
This solution provides a fast, SQL-based search across all levels of the JSON structure, utilizing PostgreSQL's JSON capabilities and appropriate indexing.Editor is loading...
Leave a Comment