Flow Studio
Result Mapping
How query results become node output — accessing rows, extracting scalar values, and transforming results using expressions for downstream nodes.
Standard Output Shape
All datasource nodes (SQL, REST, DataOcean) produce the same output shape for consistency:
{
"rows": [ /* array of row objects */ ],
"rowCount": 42
}
Common Access Patterns
// First row, single field:
$output.queryInvoices.rows[0].invoice_number
// All rows as array (for ForEach):
$output.queryInvoices.rows
// Row count guard:
$output.queryInvoices.rowCount > 0
// Sum across all rows:
$output.queryPayroll.rows.reduce((sum, row) => sum + row.gross_pay, 0)
// Extract array of IDs:
$output.queryInvoices.rows.map(row => row.invoice_id)
// First matching row (filter in expression):
$output.queryInvoices.rows.find(row => row.currency === 'USD')
// Scalar single-row query:
$output.getCount.rows[0].count // SELECT COUNT(*) AS count FROM ...
Transforming Results
// Map rows to a widget-friendly shape:
"items": "$output.queryInvoices.rows.map(row => ({ id: row.invoice_id, label: row.invoice_number, amount: row.total, currency: row.currency }))"
// Group by currency:
"byCurrency": "$output.queryInvoices.rows.reduce((acc, row) => { (acc[row.currency] = acc[row.currency] || []).push(row); return acc; }, {})"
ForEach integration: Pass
$output.{nodeId}.rows directly to a ForEach node's items field to iterate over query results. Inside the loop body, each row is available as $json.