Portal Community
Atlas only. This operation requires MongoDB Atlas M10 or above. It is not available on self-hosted MongoDB, MongoDB Community Edition, or shared-tier Atlas clusters (M0, M2, M5).

When to Use

Configuration

Connection

FieldRequiredDescription
ConnectionUriRequiredMongoDB Atlas connection string. Reference via {{ $credentials.mongodbAtlas }}.
DatabaseRequiredDatabase name containing the target collection.
CollectionRequiredCollection name to list Atlas Search indexes for.

This operation has no additional configuration parameters. All fields are connection-level.

Sample Configuration

{
  "resource": "search-index",
  "operation": "list",
  "ConnectionUri": "{{ $credentials.mongodbAtlas }}",
  "Database": "ecommerce",
  "Collection": "products"
}

Validation Errors

ErrorCause
connectionUri is requiredConnectionUri is empty or not provided.
database is requiredDatabase field is empty.
collection is requiredCollection field is empty.

Output — Success Port

FieldTypeDescription
countintegerNumber of Atlas Search indexes defined on the collection. 0 if no indexes exist.
indexesarrayArray of index descriptor objects, one per defined index. Each object includes at minimum: name (string), status (string — READY, PENDING, BUILDING, FAILED), and definition (object with the full index mapping). May also include id and queryable fields.
statusstringAlways "success".
resourcestringAlways "search-index".
operationstringAlways "list".

Sample Output

{
  "count": 2,
  "indexes": [
    {
      "id": "64f2a0e1c3b4d5e6f7a8b901",
      "name": "product_search",
      "status": "READY",
      "queryable": true,
      "definition": {
        "mappings": {
          "dynamic": false,
          "fields": {
            "name":        { "type": "string", "analyzer": "lucene.standard" },
            "description": { "type": "string", "analyzer": "lucene.standard" },
            "category":    { "type": "string", "analyzer": "lucene.keyword" },
            "price":       { "type": "number" }
          }
        }
      }
    },
    {
      "id": "64f2a0e1c3b4d5e6f7a8b902",
      "name": "product_vector_search",
      "status": "BUILDING",
      "queryable": false,
      "definition": {
        "mappings": {
          "dynamic": false,
          "fields": {
            "embedding": {
              "type": "knnVector",
              "dimensions": 1536,
              "similarity": "cosine"
            }
          }
        }
      }
    }
  ],
  "status": "success",
  "resource": "search-index",
  "operation": "list"
}

Expression Reference

ExpressionReturnsDescription
{{ $output.ListIndexes.count }}integerTotal indexes found. Branch on count == 0 to detect collections with no search indexes.
{{ $output.ListIndexes.indexes }}arrayFull index list. Pass to a Loop node to inspect each index individually.
{{ $output.ListIndexes.indexes[0].name }}stringName of the first index.
{{ $output.ListIndexes.indexes[0].status }}stringStatus of the first index — READY, PENDING, BUILDING, or FAILED.
{{ $output.ListIndexes.indexes[0].queryable }}booleantrue when the index is ready to serve $search queries. Gate dependent aggregations on this value.
{{ $output.ListIndexes.indexes[0].definition }}objectThe full index definition object for inspection or comparison.

Node Policies & GuardRails

PolicyRecommendation
Credential storageAlways reference ConnectionUri from BizFirst Credentials Manager. This operation authenticates to Atlas using the connection string credentials.
Atlas tier requirementBefore using this operation, confirm the target cluster is M10+. A connection error or empty index list from an M0/M2/M5 cluster is expected behaviour — the API endpoint is unavailable on shared tiers.
Gate $search on READY statusNever execute a $search aggregation without first verifying the index status == "READY" and queryable == true. A non-READY index either returns no results or raises an error, causing silent search failures.
Poll after create/updateAfter creating or updating an index, poll this operation every 10–30 seconds until the index reaches READY state. Do not assume the index is immediately usable — build time depends on collection size.
Error port for FAILED statusCheck each returned index for status == "FAILED" in a loop. A failed index silently serves stale or no results. Trigger an alert and attempt searchindex/update or manual intervention when a FAILED index is detected.
Audit regularlySchedule a weekly searchindex/list run across all critical collections to detect orphaned indexes consuming resources and indexes stuck in non-READY states that may have gone unnoticed.

Workflow Examples

Example 1 — Pre-Deployment Index Check

{
  "resource": "search-index",
  "operation": "list",
  "ConnectionUri": "{{ $credentials.mongodbAtlas }}",
  "Database": "ecommerce",
  "Collection": "products"
}
// Follow with IfCondition:
// indexes.find(i => i.name === "product_search" && i.status === "READY")
// Branch "not found" → Slack alert + halt deployment

Example 2 — Poll Index Until READY

// Loop node wraps: [Delay 15s] → [searchindex/list] → [IfCondition]
// IfCondition: $output.PollIndex.indexes[0].status == "READY"
//   true  → exit loop, continue workflow
//   false → continue loop (retry)
{
  "resource": "search-index",
  "operation": "list",
  "ConnectionUri": "{{ $credentials.mongodbAtlas }}",
  "Database": "catalog",
  "Collection": "{{ $json.targetCollection }}"
}

Example 3 — Weekly Index Audit Report

{
  "resource": "search-index",
  "operation": "list",
  "ConnectionUri": "{{ $credentials.mongodbAtlas }}",
  "Database": "{{ $json.database }}",
  "Collection": "{{ $json.collection }}"
}
// Runs inside a Loop over a list of {database, collection} pairs
// Collects all outputs, then formats and emails the audit summary