I have the following tables:
products
 id |    name     
----+-------------
  1 | Shampoo
  2 | Conditioner
productOptions
 id |    name     | productId 
----+-------------+-----------
  1 | Hair Growth |         1
  2 | Frizzy Hair |         1
images
 id | fileName  | productOptionId 
----+-----------+-----------------
  1 | bee.png   |               1
  2 | fancy.png |               2
  3 | soap.png  |               2
products have many productOptions, and productOptions have many images.
Following from this question, I have aggregated images.fileName twice to get an aggregated list of the fileNames for each product:
SELECT p.name, o.options, o.images
FROM products p
LEFT JOIN (
    SELECT "productId", array_agg(name) AS options, json_agg(i.images) AS images
    FROM "productOptions" o
    LEFT JOIN (
        SELECT "productOptionId", json_agg(i."fileName") AS images
        FROM images i
        GROUP BY 1
    ) i ON i."productOptionId" = o.id
    GROUP BY 1
) o ON o."productId" = p.id;
    name     |            options            |                  images                  
-------------+-------------------------------+------------------------------------------
 Shampoo     | {"Hair Growth","Frizzy Hair"} | [["bee.png"], ["fancy.png", "soap.png"]]
 Conditioner |                               | 
I am wondering how to flatten the second json_agg so that the list of images is flat, and if my overall approach makes sense.
 
    