Ok, for a simple nesting case the NEST statement is the fastest and cleaner solution:
My real use case has two nested levels: a TOUR object refers to multiple STEP objects (TOUR contains STEPs id array and STEP document contains TOUR parent_id property) and each of them can refer multiple TASK objects (TASK contains TOURs parent_id property), this is a sample model:
-- TOP LEVEL
INSERT INTO tour (key, value) VALUES ("TOUR_QUERY_TEST_1", {"title" : "Test 1", "desc" : "Query test 1", "steps": ["STEP_QT_1_1","STEP_QT_1_2"]});
INSERT INTO tour (key, value) VALUES ("TOUR_QUERY_TEST_2", {"title" : "Test 2", "desc" : "Query test 2", "steps": ["STEP_QT_2_1","STEP_QT_2_2","STEP_QT_2_3"]});
-- FIRST NESTED LEVEL
INSERT INTO step (key, value) VALUES ("STEP_QT_1_1", {"title" : "Test 1-1", "desc" : "Query test 1-1", "parent_id": "TOUR_QUERY_TEST_1"});
INSERT INTO step (key, value) VALUES ("STEP_QT_1_2", {"title" : "Test 1-2", "desc" : "Query test 1-2", "parent_id": "TOUR_QUERY_TEST_1"});
INSERT INTO step (key, value) VALUES ("STEP_QT_2_1", {"title" : "Test 2-1", "desc" : "Query test 2-1", "parent_id": "TOUR_QUERY_TEST_2"});
INSERT INTO step (key, value) VALUES ("STEP_QT_2_2", {"title" : "Test 2-2", "desc" : "Query test 2-2", "parent_id": "TOUR_QUERY_TEST_2"});
INSERT INTO step (key, value) VALUES ("STEP_QT_2_3", {"title" : "Test 2-3", "desc" : "Query test 2-3", "parent_id": "TOUR_QUERY_TEST_2"});
-- SECOND NESTED LEVEL
INSERT INTO task (key, value) VALUES ("TASK_QT_1_1_1", {"title" : "Test 1-1-1", "desc" : "Query test 1-1-1", "parent_id": "STEP_QT_1_1"});
INSERT INTO task (key, value) VALUES ("TASK_QT_1_1_2", {"title" : "Test 1-1-2", "desc" : "Query test 1-1-2", "parent_id": "STEP_QT_1_1"});
INSERT INTO task (key, value) VALUES ("TASK_QT_1_2_1", {"title" : "Test 1-2-1", "desc" : "Query test 1-2-1", "parent_id": "STEP_QT_1_2"});
INSERT INTO task (key, value) VALUES ("TASK_QT_2_1_1", {"title" : "Test 2-1-1", "desc" : "Query test 2-1-1", "parent_id": "STEP_QT_2_1"});
INSERT INTO task (key, value) VALUES ("TASK_QT_2_2_1", {"title" : "Test 2-2-1", "desc" : "Query test 2-2-1", "parent_id": "STEP_QT_2_2"});
Thanks to @geraldss solution to this topic I’ve been able to get the solution to my real case:
SELECT OBJECT_ADD(s.tour, "steps_docs", ARRAY_AGG(s.step)) as tour
FROM
(
SELECT tours as tour, OBJECT_ADD(steps, "tasks_docs", ARRAY_AGG(tasks)) AS step
FROM tour tours
LEFT OUTER JOIN step steps ON KEY steps.parent_id FOR tours
LEFT OUTER JOIN task tasks ON KEY tasks.parent_id FOR steps
GROUP BY tours, steps
) AS s
GROUP BY s.tour;
I haven’t been able to find a solution with NEST, is it eventually possible?