UNPKG

mingo

Version:

MongoDB query language for in-memory objects

44 lines (43 loc) 1.28 kB
import { ComputeOptions, computeValue } from "../../../core/_internal"; import { assert, has, isArray, isInteger, isNil, isObject, truthy } from "../../../util/_internal"; import { errExpectArray, errExpectNumber } from "../_internal"; const $filter = (obj, expr, options) => { assert( isObject(expr) && has(expr, "input", "cond"), "$filter expects object { input, as, cond, limit }" ); const input = computeValue(obj, expr.input, null, options); const foe = options.failOnError; if (isNil(input)) return null; if (!isArray(input)) return errExpectArray(foe, "$filter 'input'"); const limit = expr.limit ?? Math.max(input.length, 1); if (!isInteger(limit) || limit < 1) return errExpectNumber(foe, "$filter 'limit'", { min: 1, int: true }); if (input.length === 0) return []; const copts = ComputeOptions.init(options); const k = expr?.as || "this"; const locals = { variables: { [k]: null } }; const res = []; for (let i = 0, j = 0; i < input.length && j < limit; i++) { locals.variables[k] = input[i]; const cond = computeValue(obj, expr.cond, null, copts.update(locals)); if (truthy(cond, options.useStrictMode)) { res.push(input[i]); j++; } } return res; }; export { $filter };