I'm building backend with Express and TypeScript. DB is Postgres, client is node-postgres
.
In DB I have table user_collection
. This table has column collection of type JSONB. Collection column contains an array of objects like this:
{ itemGroup: 'ANIME', itemId: 55555 }
There could be a lot of objects in this array and what I need is the query that will remove object from array by id. I've already tried few queries but every time I got an error. So for now my workaround has 2 steps. First is to get full collection.
const userCollection = await db.query(
'SELECT collection FROM user_collection WHERE user_id = $1',
[1],
);
Second is to filter this array and save filtered array in collection.
const updatedCollection = existedCollection.filter(
(item: any) => item.itemId !== 11111,
);
db.query('UPDATE user_collection SET collection = $2 WHERE user_id = $1', [
1,
JSON.stringify(updatedCollection),
]);
Is it possible to use one query and leave filtering for DB?
The following removes the selected items from collection
for the specified user_id
in a single query:
db.query("UPDATE user_collection
SET collection =
JSONB_PATH_QUERY_ARRAY(collection,
('$[*] ? (@.itemId != ' || $2 || ')')::JSONPATH)
WHERE user_id = $1", [1, 11111]);