mingo
Version:
MongoDB query language for in-memory objects
34 lines (33 loc) • 1.13 kB
JavaScript
import { Query } from "../../query";
import { isArray, isObject, isOperator } from "../../util";
import { applyUpdate, DEFAULT_OPTIONS, walkExpression } from "./_internal";
function $pull(expr, arrayFilters = [], options = DEFAULT_OPTIONS) {
const predicates = Object.values(expr).map((pullSpec) => {
const wrap = !isObject(pullSpec) || Object.keys(pullSpec).some(isOperator);
const query = new Query(wrap ? { k: pullSpec } : pullSpec, options);
return wrap ? (v) => query.test({ k: v }) : (v) => query.test(v);
});
return (obj) => {
let index = 0;
return walkExpression(expr, arrayFilters, options, (_, node, queries) => {
const pred = predicates[index++];
return applyUpdate(obj, node, queries, (o, k) => {
const prev = o[k];
if (!isArray(prev) || !prev.length) return false;
const curr = new Array();
let ok = false;
for (const v of prev) {
const b = pred(v);
if (!b) curr.push(v);
ok ||= b;
}
if (!ok) return false;
o[k] = curr;
return true;
});
});
};
}
export {
$pull
};