Skip to main content
The collections module provides structured data storage and querying for automations. It supports both MongoDB and SQL backends, with automatic namespace isolation per workspace and app.
This module is meant to be used through the Collection application, which provides a ready-to-use UI for managing collections and schemas. The functions below are available directly via the run instruction for advanced use cases.

Schema Management

- run:
    module: collections
    function: updateSchema
    parameters:
      collection: customers
      schema: customers
      properties:
        name:
          type: string
        email:
          type: string
        age:
          type: number
      indexes:
        - properties: [email]
      uniques:
        - properties: [email]
    output: result
ParameterTypeRequiredDescription
collectionstringyesCollection name
schemastringyesSchema name
propertiesobjectyesField definitions (name, type, nullable, etc.)
indexesarraynoIndex definitions
uniquesarraynoUnique constraint definitions
oldCollectionstringnoPrevious collection name (for renaming)
oldSchemastringnoPrevious schema name (for renaming)
All collections automatically include createdAt, updatedAt, createdBy, and updatedBy fields.
- run:
    module: collections
    function: listCollections
    output: collections
Returns an array of collection names in the current workspace/app namespace.
- run:
    module: collections
    function: getCollectionSchemas
    output: schemas
Returns all schema definitions for the current namespace.
- run:
    module: collections
    function: getCollectionStats
    parameters:
      collection: customers
    output: stats
ParameterTypeRequiredDescription
collectionstringyesCollection name
Returns usage statistics (document count, size, etc.).
- run:
    module: collections
    function: inferCollectionSchema
    parameters:
      collection: customers
    output: inferred
ParameterTypeRequiredDescription
collectionstringnoInfer from an existing collection
dataobject[]noInfer from sample data
Analyzes data and returns an inferred schema with warnings. Provide either collection or data.
- run:
    module: collections
    function: deleteCollections
    parameters:
      collections:
        - old-collection
        - temp-data
    output: result
ParameterTypeRequiredDescription
collectionsstring[]noSpecific collections to delete
allbooleannoDelete all collections in the namespace

Read Operations

- run:
    module: collections
    function: findOne
    parameters:
      collection: customers
      query:
        email: "jane@example.com"
    output: customer
ParameterTypeRequiredDescription
collectionstringyesCollection name
queryobjectyesFilter criteria
- run:
    module: collections
    function: findMany
    parameters:
      collection: customers
      query:
        age:
          $gte: 18
      opts:
        sort:
          createdAt: -1
        limit: 50
        page: 1
    output: customers
ParameterTypeRequiredDescription
collectionstringyesCollection name
queryobjectyesFilter criteria
opts.sortobjectnoSort order (1 ascending, -1 descending)
opts.limitnumbernoMaximum documents to return
opts.pagenumbernoPage number (1-indexed)
opts.skipnumbernoNumber of documents to skip
opts.fieldsstring[]noFields to include in results
- run:
    module: collections
    function: findAndCount
    parameters:
      collection: customers
      query: {}
      opts:
        limit: 10
        page: 1
    output: result
Returns [entities, totalCount] — useful for paginated UIs.
ParameterTypeRequiredDescription
collectionstringyesCollection name
queryobjectyesFilter criteria
optsobjectnoSame options as findMany
- run:
    module: collections
    function: count
    parameters:
      collection: customers
      query:
        status: active
    output: total
ParameterTypeRequiredDescription
collectionstringyesCollection name
queryobjectyesFilter criteria
- run:
    module: collections
    function: distinct
    parameters:
      collection: customers
      query: {}
      field: country
    output: countries
ParameterTypeRequiredDescription
collectionstringyesCollection name
queryobjectyesFilter criteria
fieldstringyesField to get distinct values for
- run:
    module: collections
    function: aggregate
    parameters:
      collection: orders
      query: {}
      steps:
        - $group:
            _id: "$status"
            count:
              $sum: 1
            totalAmount:
              $sum: "$amount"
    output: stats
ParameterTypeRequiredDescription
collectionstringyesCollection name
queryobjectyesInitial filter criteria
stepsobject[]yesAggregation pipeline stages

Write Operations

- run:
    module: collections
    function: create
    parameters:
      collection: customers
      data:
        name: "Jane Doe"
        email: "jane@example.com"
        age: 28
    output: result
ParameterTypeRequiredDescription
collectionstringyesCollection name
dataobjectyesDocument to insert
outputModestringno"entity" to return full document, "simple" (default) to return { acknowledged, insertedId }
createdAt and updatedAt are set automatically.
- run:
    module: collections
    function: bulkCreate
    parameters:
      collection: customers
      data:
        - name: "Alice"
          email: "alice@example.com"
        - name: "Bob"
          email: "bob@example.com"
    output: result
ParameterTypeRequiredDescription
collectionstringyesCollection name
dataobject[]yesDocuments to insert
outputModestringno"entity" for full documents, "simple" (default) for { acknowledged, insertedCount, insertedIds }

Update Operations

- run:
    module: collections
    function: updateOne
    parameters:
      collection: customers
      query:
        email: "jane@example.com"
      data:
        age: 29
    output: result
ParameterTypeRequiredDescription
collectionstringyesCollection name
queryobjectyesFilter to find the document
dataobjectyesFields to update
allowMatchAllbooleannoAllow empty query (updates first match)
updatedAt is set automatically. Returns { modifiedCount, matchedCount }.
An empty query without allowMatchAll: true throws an error to prevent accidental mass updates.
- run:
    module: collections
    function: updateMany
    parameters:
      collection: customers
      query:
        status: inactive
      data:
        archived: true
    output: result
Same parameters and behavior as updateOne, but affects all matching documents.
- run:
    module: collections
    function: upsert
    parameters:
      collection: customers
      data:
        email: "jane@example.com"
        name: "Jane Doe"
        lastSeen: "{{run.date}}"
      opts:
        onConflictFields:
          - email
        onInsertValues:
          source: "signup"
    output: result
ParameterTypeRequiredDescription
collectionstringyesCollection name
dataobjectyesDocument data
opts.onConflictFieldsstring[]yesFields to match for conflict detection
opts.onInsertValuesobjectnoAdditional values set only on insert
outputModestringno"entity" for full document, "simple" (default) for { acknowledged, upsertedCount, modifiedCount }
createdAt is set only on insert; updatedAt is always set.

Delete Operations

- run:
    module: collections
    function: deleteOne
    parameters:
      collection: customers
      query:
        email: "jane@example.com"
    output: result
ParameterTypeRequiredDescription
collectionstringyesCollection name
queryobjectyesFilter to find the document
allowMatchAllbooleannoAllow empty query
Returns { deletedCount }.
An empty query without allowMatchAll: true throws an error to prevent accidental mass deletion.
- run:
    module: collections
    function: deleteMany
    parameters:
      collection: customers
      query:
        status: inactive
    output: result
Same parameters as deleteOne, but deletes all matching documents.

Query Syntax

Queries use MongoDB-style operators:
# Exact match
query:
  status: active

# Comparison
query:
  age:
    $gte: 18
    $lt: 65

# Logical operators
query:
  $or:
    - status: active
    - role: admin

# Pattern matching
query:
  name:
    $regex: "^Jane"

Complete Example

slug: manage-contacts
name: Manage Contacts
do:
  # Create a contact
  - run:
      module: collections
      function: create
      parameters:
        collection: contacts
        data:
          name: "{{body.name}}"
          email: "{{body.email}}"
          tags: "{{body.tags}}"
      output: created

  # Find contacts by tag
  - run:
      module: collections
      function: findMany
      parameters:
        collection: contacts
        query:
          tags:
            $in:
              - vip
        opts:
          sort:
            createdAt: -1
          limit: 20
      output: vipContacts

  # Update a contact
  - run:
      module: collections
      function: updateOne
      parameters:
        collection: contacts
        query:
          id: "{{contactId}}"
        data:
          lastContacted: "{{run.date}}"
      output: updated