# Data Transform

> Data Transform operations for filtering, mapping, and grouping collections.

Transforms data using a variety of operations. The Data Transform node and its individual operation nodes (Filter, Map, Group By) are available as separate selectable nodes in the node palette.

## When to use Data Transform vs Script

Use **Data Transform** operations when the transformation is a field-level operation on a collection. The available operations cover:

- Filtering
- Mapping
- Grouping

Use **Script** when the transformation requires conditional logic, arithmetic, or string manipulation, or when no dedicated operation covers the case. Both can be combined: a Data Transform operation can filter or reshape a collection, then pass the result to a Script node.

## Output

All Data Transform operation nodes output their result as `output`, accessible downstream as `$vars.<nodeName>.output`.

## Filter

Keeps only the entries in a collection that match your conditions.

### Configuration

| Field | Required | Description |
|---|---|---|
| **Input** | Yes | The collection (array) to filter. Reference as `$vars.<nodeName>.output`. |
| **Conditions** | Yes | One or more conditions. An entry is kept only if all conditions are met. |

### Example

Keep only orders with a `status` of `"completed"`:

- Input: `$vars.fetchOrders1.output.body`
- Condition: `status` equals `completed`

Output available as `$vars.filter1.output`.

## Map

Transforms each entry in a collection by modifying or reshaping its fields.

### Configuration

| Field | Required | Description |
|---|---|---|
| **Input** | Yes | The collection (array) to transform. |
| **Field mappings** | Yes | For each target field, define the name and the source field or expression. |

### Example

Rename `firstName` and `lastName` fields to `first` and `last`:

| Target field | Source mapping |
|---|---|
| `first` | `firstName` |
| `last` | `lastName` |

Output available as `$vars.map1.output`.

## Group By

Groups a collection by a shared field and aggregates values like totals, averages, or counts.

### Configuration

| Field | Required | Description |
|---|---|---|
| **Input** | Yes | The collection (array) to group. |
| **Group by field** | Yes | The field whose value determines the group. |
| **Aggregations** | No | Additional computed fields per group (count, sum, average, min, max, first, last, collect). |

### Example

Group a list of orders by `region` and count the number of orders per region:

- Input: `$vars.fetchOrders1.output.body`
- Group by: `region`
- Aggregation: `orderCount` = count

Output available as `$vars.groupBy1.output`.

## Common issues

| Issue | Resolution |
|---|---|
| Output is empty after Filter | The conditions don't match any entries. Inspect the input collection in the execution trace to verify the field names and values. |
| Map output has `undefined` fields | The source field path doesn't exist in the input entries. Use the execution trace to confirm the input structure. |
