2016-05-05 6 views
5

В отношении к UPDATE multiple rows from multiple params in nodejs/pg, мне нужно выполнить следующую команду:Преобразовать массив объектов в массив совместимый для nodejs/пг/unnest

update portfolios p 
set votes = s.votes 
from unnest(array[(5, 1), (15, 1), (25, 2)]) s (votes int, id int) 
where p.id = s.id 

где мой массив в unnest составляет $ 1, следующим образом:

update portfolios p 
set votes = s.votes 
from unnest($1) s (votes int, id int) 
where p.id = s.id 

Однако мой массив изначально состоит из объектов, как:

[{votes: 5, id: 1}, {votes: 15, id: 1}, {votes: 25, id: 2}] 

Я попытался преобразовать его с:

my_array = my_array.map(function(e) { return tuple(e.votes, e.id); }); 

Но это не удается.

Мне нужно скорректировать совместимый массив со значениями для использования с pg и Client.query.

Как я могу преобразовать свой массив объектов в соответствие с javascript и postgresql unsest?

+0

Зачем вам нужно сделать это одно утверждение 'update'; почему бы не запустить несколько операторов 'update'? –

+0

Я использую nodejs с pg, который не поддерживает несколько запросов, не делая ручную петлю между всеми утверждениями - видимо. Если доступно другое решение, я все уши. –

+0

Как это происходит? Есть ли способ вывести запрос, который подается в Postgresql? –

ответ

0

Вы можете отправить строку JSON, как это и есть PostgreSQL сделки с ним:

update portfolios p 
set votes = s.votes 
from (
    select (e->>'votes')::int as votes, (e->>'id')::int as id 
    from (select (regexp_replace($1, '"\1"', 'g'))::jsonb as jarr) j 
    cross join jsonb_array_elements(jarr) e 
) s 
where p.id = s.id; 

Где $1 является [{votes: 5, id: 1}, {votes: 15, id: 1}, {votes: 25, id: 2}]', '([a-z]+) в виде строки.

0

@Ziggy Идея передачи JSON может работать, хотя идеальным было бы сделать драйвер адаптированным для вашего массива. Это последний запрос водитель должен пройти Postgresql

update portfolios p 
set votes = s.votes 
from (
    select (a->>'votes')::int as votes, (a->>'id')::int as id 
    from (
     select jsonb_array_elements(a) as a 
     from (values ('[{"votes": 5, "id": 1}, {"votes": 15, "id": 1}]'::jsonb)) s(a) 
    ) s 
) s 
where p.id = s.id 

и запрос передать водителю:

update portfolios p 
set votes = s.votes 
from (
    select (a->>'votes')::int as votes, (a->>'id')::int as id 
    from (
     select jsonb_array_elements(a) as a 
     from (values (($1)::jsonb)) s(a) 
    ) s 
) s 
where p.id = s.id 

Параметр $1 должен быть jsonified с чем-то вроде JSON.stringify:

var a = JSON.stringify(my_array_of_objects); 
Смежные вопросы