Portal Community

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.