Postgres: получение объекта json из массива - PullRequest
0 голосов
/ 11 ноября 2019

Я хочу вернуть {id: 'single-entry'} вместо [{Id:'single-entry'}]

Я бегу PostgreSQL v11.5

Я просмотрел много разных примеров в Интернете, но массив с одной строкой выигралне превращается в объект json.

Из этого запроса:

SELECT row_to_json(row)
FROM
(
    SELECT 
        t.*,
        json_agg(json_build_object('name', tr."name", 'id', r."remixTrackId")) 
        FILTER (WHERE tr."id" IS NOT NULL)
        AS remixes
    FROM "Tracks" t
        LEFT JOIN "Remixes" r ON r."originalTrackId" = t."id"
        LEFT JOIN "Tracks" tr ON tr."id" = r."remixTrackId"
    WHERE t."id" = '${trackId}'
    GROUP BY t."id"
) row;

Что я бы ожидал:

{
  "id": "track-id2",
  "name": "My track 2",
  "dateModified": "2019-11-09T21:41:30.482634",
  "channels": {
    "some": "json"
  },
  "userId": 1,
  "remixes": null
}

Что я получу:

[
  {
    "row_to_json": {
      "id": "track-id2",
      "name": "My track 2",
      "dateModified": "2019-11-09T21:41:30.482634",
      "channels": {
        "some": "json"
      },
      "userId": 1,
      "remixes": null
    }
  }
]

Соединение с БД и запрос выглядят так. Я использую Node и Heroku, где работает Postgres

Это более полный фрагмент того, как я выполняю запрос:

const pg = require('pg')
const config = {
    user: 'xxx',
    database: 'xxx',
    password: 'xxx',
    port: 5432,
    ssl: true
};
const pool = new pg.Pool({ 
    connectionString: `postgres://${config.user}:${config.password}@xxx.amazonaws.com:5432/${config.database}`,
    ...config
})

app.get('/api/postgres/get-track', function(request, response) {
    const trackId = R.path(['query','id'], request)
    pool.connect(function(err, client, done) {
        if(err) {
            response.send("Could not connect to DB: " + err)
        } else {
            client.query(`
            SELECT row_to_json(row)
            FROM
            (
                SELECT 
                    t.*,
                    json_agg(json_build_object('name', tr."name", 'id', r."remixTrackId")) 
                    FILTER (WHERE tr."id" IS NOT NULL)
                    AS remixes
                FROM "Tracks" t
                    LEFT JOIN "Remixes" r ON r."originalTrackId" = t."id"
                    LEFT JOIN "Tracks" tr ON tr."id" = r."remixTrackId"
                WHERE t."id" = '${trackId}'
                GROUP BY t."id"
            ) row;
            `, function(err, result) {
                done()
                if(err) return response.send(err)
                response.send(result.rows);
            })
        }
    }) 
})

Пожалуйста, помогите мне указать, что я делаю неправильно,Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Я решил, решение выглядит так (с помощью JS):

const R = require('ramda')
const pg = require('pg')

app.get('/api/postgres/get-track', function(request, response) {
    const trackId = R.path(['query','id'], request)
    pool.connect(function(err, client, done) {
        if(err) {
            response.send("Could not connect to DB: " + err)
        } else {
            client.query(`
                SELECT 
                    t.*,
                    json_agg(json_build_object('name', tr."name", 'id', r."remixTrackId")) 
                    FILTER (WHERE tr."id" IS NOT NULL)
                    AS remixes
                FROM "Tracks" t
                    LEFT JOIN "Remixes" r ON r."originalTrackId" = t."id"
                    LEFT JOIN "Tracks" tr ON tr."id" = r."remixTrackId"
                WHERE t."id" = '${trackId}'
                GROUP BY t."id";
            `, function(err, result) {
                done()
                if(err) return response.send(err)
                const foundTrack = R.head(result.rows)
                if(foundTrack) {
                    response.send(foundTrack)
                } else {
                    //Error response here
                }
            })
        }
    }) 
})
0 голосов
/ 11 ноября 2019

Вы можете удалить функцию json_agg() и добавить все столбцы в списке SELECT в список GROUP BY в подзапросе

SELECT row_to_json(row) as remixes
  FROM
  (
    SELECT 
          t."id", t."name", t."dateModified",
          json_build_object('some', tr."some") AS channels,
          t."userId", null AS "remixes"
      FROM "Tracks" t
      LEFT JOIN "Remixes" r ON r."originalTrackId" = t."id"
      LEFT JOIN "Tracks" tr ON tr."id" = r."remixTrackId"
     WHERE t."id" = '${trackId}'
  GROUP BY t."id", t."name", t."userId", tr."some", t."dateModified"
) row  
...