【发布时间】:2018-03-13 18:42:44
【问题描述】:
我在 postgres 上有一个名为 data 的 jsonb 结构,其中每一行(大约有 300 万行)如下所示:
[
{
"number": 100,
"key": "this-is-your-key",
"listr": "20 Purple block, THE-CITY, Columbia",
"realcode": "LA40",
"ainfo": {
"city": "THE-CITY",
"county": "Columbia",
"street": "20 Purple block",
"var_1": ""
},
"booleanval": true,
"min_address": "20 Purple block, THE-CITY, Columbia LA40"
},
.....
]
我想以最快的方式查询min_address 字段。在 Django 中我尝试使用:
APModel.objects.filter(data__0__min_address__icontains=search_term)
但这需要很长时间才能完成(另外,“THE-CITY”是大写的,所以我必须在这里使用icontains。我尝试像这样下降到rawsql:
cursor.execute("""\
SELECT * FROM "apmodel_ap_model"
WHERE ("apmodel_ap_model"."data"
#>> array['0', 'min_address'])
@> %s \
""",\
[json.dumps([{'min_address': search_term}])]
)
但这会给我带来奇怪的错误,例如:
LINE 4: @> '[{"min_address": "some lane"}]'
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
我想知道使用 rawsql 游标查询字段 min_address 的最快方法是什么。
【问题讨论】:
-
data字段包含一个 JSON,它实际上是一个包含大量对象的数组。您真的要仅在数组的第一个对象 (data__0__min_address) 中搜索min_address吗? -
@cezar:你是对的 - 我想搜索数组中的所有对象。我该怎么做呢?这就是我想要进行 rawSQL 搜索的原因。
标签: django postgresql psycopg2 django-orm