There's two tables:
- users
- documents
users
:
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
username TEXT NOT NULL UNIQUE
)
documents
:
CREATE TABLE IF NOT EXISTS documents (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL REFERENCES users,
name TEXT NOT NULL,
value INT NOT NULL
)
I want to filter users
by document name
and value
. Usually, between 2-5 document name
and value
is filtered. And there are apprx 6-10 documents per user.
I have a huge database and want to improve this query. I think I can get faster query without the HAVING
clause. Any help highly appreciated. I use PostgreSQL 13.
The query I am using:
SELECT
users.username,
jsonb_agg(jsonb_strip_nulls(jsonb_build_object('name', documents.name, 'value', documents.value))) AS docs
FROM
users
JOIN
documents
ON
users.id = documents.user_id
GROUP BY
users.username
HAVING
jsonb_agg(jsonb_build_object('name', documents.name, 'value', documents.value)) @? '$[*] ? (@.name == "doc1") ? (@.value == "2")'