агрегация подсчета в поле jsondata-> с использованием запроса ORM django - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть модель как

from jsonfield import JSONField
class data(model):
     content=JSONField()
     .......

Моя примерная запись БД для данных модели будет

data1   : id =1, content = {"email":"abc@gmail.com"}
data2   : id =2, content = {"email":"cdf@gmail.com"}
data3   : id =3,  content ={"email":"abc@gmail.com"}
data4   : id = 4, content ={"email":"sfg@gmail.com"}
data5   : id = 5, content ={"email":"abc@gmail.com"}
data6   : id = 6, content ={"email":"sfg@gmail.com"}

Мне нужно найти неуникальные значения "email" и список идентификаторов, таких как

"abc@gmail.com"  :  [1,3,5]
"sfg@gmail.com   :  [4,6]

Я использую django 1.11 и python 2.7 и postgres9.3

Мой запрос был

lists = data.objects.filter(....).extra(select={'email':"content->>'email'"}).values('email','id')

я получил

{"email":"abc@gmail.com","id":1}
{"email":"cdf@gmail.com","id":2}
{"email":"abc@gmail.com","id":3}
{"email":"sfg@gmail.com","id":4}
{"email":"abc@gmail.com","id":5}
{"email":"sfg@gmail.com","id":6}

Включает в себя уникальные и неуникальные значения, что не является обязательным.

Запрос 1: Есть ли возможность запрашивать только уникальные значения из поля JSON с помощью Django.

Попытка distinct(), но в части значений * 1025 она не работает как 'id' и 'email'

все равно обработал его как

for d in lists:
    if d['email'] not in temp:
        temp[d['email']]=[d['id']]
    else:
        temp[d['email']].append(d['id'])

Получены результаты как все значения, включая уникальные и неуникальные, как показано ниже

"abc@gmail.com"  :  [1,3,5]
"sfg@gmail.com"  :  [4,6]
"cdf@gmail.com"  :  [2] ## not desired

Запрос2: Есть ли способ повысить эффективность обработки этих данных?

1 Ответ

0 голосов
/ 09 ноября 2018

Для postgresql и django> = 1,9 вы можете попробовать ArrayAgg . Ваш запрос может быть таким

lists = data.objects.filter(....).extra(select={'email':"content->>'email'"}).values('email','id').aggregate(list=ArrayAgg('id'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...