2016-05-05 14 views
5

Liên quan đến UPDATE multiple rows from multiple params in nodejs/pg, tôi cần phải chạy như sau:Chuyển đổi đối tượng mảng vào mảng tương thích với nodejs/pg/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 

nơi mảng của tôi trong unnest là $ 1, như sau:

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

Tuy nhiên, mảng của tôi ban đầu bao gồm các đối tượng, như:

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

tôi đã cố gắng để chuyển đổi nó với:

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

Nhưng điều đó không thành công.

Tôi cần sửa mảng tương thích với các giá trị để sử dụng với pg và Client.query.

Làm cách nào để chuyển đổi mảng đối tượng của mình để tôn trọng javascript và postgresql không cần thiết?

+0

Tại sao bạn cần thực hiện câu lệnh 'update' đơn lẻ này; tại sao không chạy nhiều câu lệnh 'update'? –

+0

Tôi đang sử dụng nodejs với pg không hỗ trợ nhiều truy vấn mà không tạo ra vòng lặp thủ công giữa tất cả các câu lệnh - rõ ràng. Nếu giải pháp khác có sẵn tôi là tất cả tai. –

+0

Làm thế nào nó thất bại? Có cách nào để xuất truy vấn đang được cung cấp cho Postgresql không? –

Trả lời

0

Bạn có thể gửi chuỗi JSON của bạn như nguyên trạng và có PostgreSQL đối phó với nó:

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; 

đâu $1[{votes: 5, id: 1}, {votes: 15, id: 1}, {votes: 25, id: 2}]', '([a-z]+) như là một chuỗi.

0

@Ziggy ý tưởng để vượt qua JSON có thể hoạt động mặc dù lý tưởng sẽ làm cho trình điều khiển thích ứng với mảng của bạn. Đây là câu hỏi cuối cùng của người lái xe phải vượt qua để 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 

Và các truy vấn để vượt qua các tài xế:

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 

Tham số $1 phải jsonified với một cái gì đó giống như JSON.stringify:

var a = JSON.stringify(my_array_of_objects); 
Các vấn đề liên quan