---
title: "Function: cascadeKvDeleteWithDoc"
description: Perform a cascade delete operation using just the Data Service (or KV).
pubDate: 2026-08-17T09:53:44.266Z
antora:
  editUrl: https://github.com/couchbaselabs/docs-devex/edit/release/8.0/modules/eventing/pages/eventing-handler-cascadeKvDeleteWithDoc.adoc
  xref: xref:server:eventing:eventing-handler-cascadeKvDeleteWithDoc.adoc[]
---

[Consult the llms.txt file for a full list of contents](/llms.txt)
[View original HTML](/server/current/eventing/eventing-handler-cascadeKvDeleteWithDoc.html)

# Function: cascadeKvDeleteWithDoc

**Goal**: Perform a cascade delete operation using just the Data Service (or KV).

* This function **cascadeKvDeleteWithDoc** merely demonstrates two different Eventing solutions

  * A cascade delete using just KV or the Data Service.
  * A work around for the fact that the OnDelete() entry point does not supply the actual document being deleted.
* Requires Eventing Storage (or metadata collection) and a "source" collection.
* Needs a Binding of type Bucket Alias (as documented in the Scriptlet).
* Will utilize a special doc.type === "proxy" with a prefix KEY of "proxy::" where the suffix after "proxy::" is the KEY to the actual document.
* Will operate on any mutation where 1) doc.type exists and 2) doc.type !== "proxy".
* When a "proxy" document is deleted the corresponding "real" document is read from KV. This allows actions such as cURL calls to be taken based on the data in the "real document.
* After the real document is read it is then deleted.
* This Scriptlet uses just KV unlike the similar example [Cascade Delete](eventing-examples-cascade-delete.md) which uses SQL++.

* cascadeKvDeleteWithDoc
* Input Data/Mutation(s)
* Output Data/Logged

```javascript
// To run configure the settings for this Function, cascadeKvDeleteWithDoc, as follows:
//
// Version 7.1+
//   "Function Scope"
//     *.* (or try bulk.data if non-privileged)
// Version 7.0+
//   "Listen to Location"
//     bulk.data.source
//   "Eventing Storage"
//     rr100.eventing.metadata
//   Binding(s)
//    1. "binding type", "alias name...", "bucket.scope.collection", "Access"
//       "bucket alias", "src_col",       "bulk.data.source",        "read and write"
//
// Version 6.X
//   "Source Bucket"
//     source
//   "MetaData Bucket"
//     metadata
//   Binding(s)
//    1. "binding type", "alias name...", "bucket",     "Access"
//       "bucket alias", "src_col",       "source",     "read and write"

function OnUpdate(doc, meta) {
    // filter out any proxy:: docs, ignore all others
    if ((meta.id).startsWith("proxy::") === true) return;
    log('OnUpdate notified of insert/update to key', meta.id);
}

function OnDelete(meta, options) {
    // only process proxy:: docs, ignore all others
    if ((meta.id).startsWith("proxy::") === false) return;

    // optional filter for just type == real or apply logic to all non 'proxy' types
    // if ((meta.id).startsWith("real::") !== true) return;

    log('A. OnDelete notified of '+options.expired ? 'delete' : 'expiry'+' of proxy', meta.id);
    var real_key = (meta.id).substr(7);
    var real_doc = src_col[real_key];
    if (real_doc) {
        delete src_col[real_key];
        log('B. OnDelete removed the real doc via key',real_key);
        log('C. OnDelete do what you want curl, etc. with the real doc',real_doc)
    } else {
        log('D. OnDelete unexpected no real doc present for key', real_key);
    }
}
```

We want a small "proxy" doc as a placeholder that we delete instead of the "real" document

```json
INPUT: KEY: proxy::real::1

{
    "id": "real::1",
    "type": "proxy"
}
```

```json
INPUT: KEY: real::1

{
  "id": 1,
  "type": "real",
  "f1": "yes",
  "f2": 1100,
  "fn": "n"
}
```

Steps to run:

* Deploy the function
* Then add the two test documents via the UI's doc editor.
* Then delete the proxy:real::1 doc via the UI's doc editor.
* The OnDelete() function will:

  * Read and store the "real" doc for processing based on the "real" doc's internal data.
  * Perform a cascade delete of the "real" doc.

```json
2021-07-18T20:08:04.459-07:00 [INFO] "C. OnDelete do what you want curl, etc. with the real doc" {"id":1,"type":"real","f1":"yes","f2":1100,"fn":"n"}

2021-07-18T20:08:04.459-07:00 [INFO] "B. OnDelete removed the real doc via key" "real::1"

2021-07-18T20:08:04.457-07:00 [INFO] "A. OnDelete notified of expiry of proxy" "proxy::real::1"

2021-07-18T20:08:00.757-07:00 [INFO] "OnUpdate notified of insert/update to key" "real::1"
```