Goal: Flatten a document for integration with a non-NOSQL RDBMS.
-
This function simpleFlatten shows how a document can be flattened into a RDBMS importable record.
-
Requires Eventing Storage (or metadata collection), a "source" collection, and a "destination" collection.
-
Will operate on all documents where doc.type === "tosync".
-
Will write transformed or flattened documents to the destination bucket with the same type and id.
-
Will also remove the flattened document in the destination bucket when the original source document is removed.
-
The "destination" collection can be shared (or replicated via XCDR to a business partner) too the cloud (AWS, Azure or GCP).
-
Note since the document is not available during an OnDelete we will filter by KEY prefix starting with
"tosync:".*
. This is a hard coded implementation. Refer to genericFlatten for a generic implementation.
-
simpleFlatten
-
Input Data/Mutation
-
Output Data/Mutation
// To run configure the settings for this Function, simpleFlatten, 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", "dst_col", "bulk.data.destination", "read and write"
//
// Version 6.X
// "Source Bucket"
// source
// "MetaData Bucket"
// metadata
// Binding(s)
// 1. "binding type", "alias name...", "bucket", "Access"
// "bucket alias", "dst_col", "destination", "read and write"
function OnUpdate(doc, meta) {
// filter
if (!doc.type || doc.type !== "tosync") return;
log("OnUpdate IN id: "+meta.id+", doc: ",doc);
try {
// convert
var oracleDoc = {
// flatten items simple 1:1 map
"id": doc.id, "type":doc.type,
// flatten subdoc
"a_sub_aa": doc.a.aa, "a_sub_ab": doc.a.ab, "a_sub_ac": doc.a.ac,
// flatten array
"b_ary_0": doc.b[0], "b_ary_1": doc.b[1], "b_ary_2": doc.b[2]
}
// log
log("OnUpdate OUT id: "+meta.id+", oracleDoc:",oracleDoc);
} catch (e) {
log ("Error on convert: "+e+", id:",meta.id);
}
// save
try {
dst_col[meta.id] = oracleDoc;
} catch (e) {
log("Error on save: "+e+", id:", meta.id);
}
}
function OnDelete(meta, options) {
// filter
if (!(meta.id.startsWith("tosync:"))) return;
log("OnDelete expired=" + options.expired +" REM id: "+meta.id);
try {
delete dst_col[meta.id];
} catch (e) {
log("Error on delete: "+e+", id:",meta.id);
}
}
INPUT: KEY tosync::1
{
"id": 1,
"type": "tosync",
"a": {
"aa": 1,
"ab": 2,
"ac": 3
},
"b": [
1,
3,
7
]
}
UPDATED/OUTPUT: KEY tosync::1
{
"id": 1,
"type": "tosync",
"a_sub_aa": 1,
"a_sub_ab": 2,
"a_sub_ac": 3,
"b_ary_0": 1,
"b_ary_1": 3,
"b_ary_2": 7
}