mingo
Version:
MongoDB query language for in-memory objects
53 lines (52 loc) • 1.39 kB
JavaScript
import { ComputeOptions, computeValue } from "../../core/_internal";
import { has, isArray, isNil, isObject } from "../../util";
const $redact = (collection, expr, options) => {
const copts = ComputeOptions.init(options);
return collection.map(
(obj) => redact(obj, expr, copts.update({ root: obj }))
);
};
function redact(obj, expr, options) {
const action = computeValue(obj, expr, null, options);
switch (action) {
case "$$KEEP":
return obj;
case "$$PRUNE":
return void 0;
case "$$DESCEND": {
if (!has(expr, "$cond")) return obj;
const output = {};
for (const [key, value] of Object.entries(obj)) {
if (isArray(value)) {
const res = new Array();
for (let elem of value) {
if (isObject(elem)) {
elem = redact(
elem,
expr,
options.update({ root: elem })
);
}
if (!isNil(elem)) res.push(elem);
}
output[key] = res;
} else if (isObject(value)) {
const res = redact(
value,
expr,
options.update({ root: value })
);
if (!isNil(res)) output[key] = res;
} else {
output[key] = value;
}
}
return output;
}
default:
return action;
}
}
export {
$redact
};