@thisisagile/easy-mongo 15.0.6 → 15.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Stages.d.ts +11 -11
- package/dist/Stages.js +22 -22
- package/dist/Stages.js.map +1 -1
- package/package.json +3 -3
- package/src/Stages.ts +107 -107
package/dist/Stages.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Filter, FindOptions } from
|
|
2
|
-
import { Get, Id, OneOrMore, Optional, PartialRecord } from
|
|
1
|
+
import { Filter, FindOptions } from "./MongoProvider";
|
|
2
|
+
import { Get, Id, OneOrMore, Optional, PartialRecord } from "@thisisagile/easy";
|
|
3
3
|
export declare const asc = 1;
|
|
4
4
|
export declare const desc = -1;
|
|
5
|
-
export type Accumulators =
|
|
5
|
+
export type Accumulators = "$sum" | "$count" | "$avg" | "$first" | "$last" | "$min" | "$max" | "$push";
|
|
6
6
|
export type Accumulator = PartialRecord<Accumulators, Filter>;
|
|
7
7
|
declare class FilterBuilder<Options> {
|
|
8
8
|
private filters;
|
|
@@ -78,18 +78,18 @@ export declare const stages: {
|
|
|
78
78
|
push: () => Accumulator;
|
|
79
79
|
};
|
|
80
80
|
search: {
|
|
81
|
-
search: (f: Record<string, Get<Filter, string>>) => {
|
|
81
|
+
search: (f: Record<string, Get<Filter, string>>) => Optional<{
|
|
82
82
|
$search: any;
|
|
83
|
-
}
|
|
84
|
-
auto: (value?: Id) => (key: string) => {
|
|
83
|
+
}>;
|
|
84
|
+
auto: (value?: Id) => (key: string) => Optional<{
|
|
85
85
|
autocomplete: {
|
|
86
86
|
path: string;
|
|
87
|
-
query:
|
|
87
|
+
query: NonNullable<string | number>[];
|
|
88
88
|
};
|
|
89
|
-
}
|
|
90
|
-
fuzzy: (value?: string, maxEdits?: number) => (key?: string) => {
|
|
89
|
+
}>;
|
|
90
|
+
fuzzy: (value?: string, maxEdits?: number) => (key?: string) => Optional<{
|
|
91
91
|
text: {
|
|
92
|
-
query: string
|
|
92
|
+
query: string;
|
|
93
93
|
path: string | {
|
|
94
94
|
wildcard: string;
|
|
95
95
|
} | undefined;
|
|
@@ -97,7 +97,7 @@ export declare const stages: {
|
|
|
97
97
|
maxEdits: number;
|
|
98
98
|
};
|
|
99
99
|
};
|
|
100
|
-
}
|
|
100
|
+
}>;
|
|
101
101
|
};
|
|
102
102
|
set: {
|
|
103
103
|
set: (f: Record<string, Get<Filter, string>>) => {
|
package/dist/Stages.js
CHANGED
|
@@ -13,15 +13,15 @@ class FilterBuilder {
|
|
|
13
13
|
.reduce((acc, [key, value]) => ({ ...acc, ...(0, easy_1.ifDefined)(this.filters[key], f => f(value)) }), {}));
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
const escapeRegex = (s) => s.replace(/[|\\{}()[\]^$+*?.]/g,
|
|
16
|
+
const escapeRegex = (s) => s.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d");
|
|
17
17
|
exports.stages = {
|
|
18
|
-
root:
|
|
19
|
-
current:
|
|
20
|
-
id:
|
|
18
|
+
root: "$$ROOT",
|
|
19
|
+
current: "$$CURRENT",
|
|
20
|
+
id: "_id",
|
|
21
21
|
decode: {
|
|
22
22
|
fields: (f) => Object.entries(f).reduce((res, [k, v]) => (0, easy_1.on)(res, r => (0, easy_1.ifDefined)((0, easy_1.isFunction)(v) ? v(k) : v, nv => (r[k] = nv))), {}),
|
|
23
23
|
fieldsArrays: (f) => Object.entries(f).reduce((res, [k, v]) => (0, easy_1.on)(res, r => (r[k] = (0, easy_1.use)((0, easy_1.toArray)(v), vs => vs.map(v => ((0, easy_1.isFunction)(v) ? v(k) : v))))), {}),
|
|
24
|
-
id: (f) => ((0, easy_1.isString)(f) ? `$${(0, easy_1.asString)(f)}` : (0, easy_1.isPrimitive)(f) ? f : Object.entries(f).map(([k, v]) => ((0, easy_1.isFunction)(v) ? v(k) : v))[0])
|
|
24
|
+
id: (f) => ((0, easy_1.isString)(f) ? `$${(0, easy_1.asString)(f)}` : (0, easy_1.isPrimitive)(f) ? f : Object.entries(f).map(([k, v]) => ((0, easy_1.isFunction)(v) ? v(k) : v))[0])
|
|
25
25
|
},
|
|
26
26
|
match: {
|
|
27
27
|
match: (f) => ({ $match: exports.stages.decode.fields(f) }),
|
|
@@ -30,21 +30,21 @@ exports.stages = {
|
|
|
30
30
|
gte: (value) => ({ $gte: value }),
|
|
31
31
|
lt: (value) => ({ $lt: value }),
|
|
32
32
|
lte: (value) => ({ $lte: value }),
|
|
33
|
-
isIn: (value, separator =
|
|
33
|
+
isIn: (value, separator = ",") => ({ $in: (0, easy_1.isString)(value) ? value.split(separator) : value }),
|
|
34
34
|
after: (date) => exports.stages.match.gte((0, Utils_1.toMongoType)(date)),
|
|
35
35
|
before: (date) => exports.stages.match.lt((0, Utils_1.toMongoType)(date)),
|
|
36
|
-
anywhere: (q) => ({ $regex: escapeRegex(q), $options:
|
|
36
|
+
anywhere: (q) => ({ $regex: escapeRegex(q), $options: "i" })
|
|
37
37
|
},
|
|
38
38
|
sort: {
|
|
39
39
|
sort: ($sort) => ((0, easy_1.isPresent)($sort) ? { $sort } : undefined),
|
|
40
40
|
asc: (key) => exports.stages.sort.sort({ [key]: exports.asc }),
|
|
41
|
-
desc: (key) => exports.stages.sort.sort({ [key]: exports.desc })
|
|
41
|
+
desc: (key) => exports.stages.sort.sort({ [key]: exports.desc })
|
|
42
42
|
},
|
|
43
43
|
group: {
|
|
44
44
|
group: (fields) => ({
|
|
45
|
-
by: (by) => ({ $group: Object.assign({ _id: exports.stages.decode.id(by) }, exports.stages.decode.fields(fields)) })
|
|
45
|
+
by: (by) => ({ $group: Object.assign({ _id: exports.stages.decode.id(by) }, exports.stages.decode.fields(fields)) })
|
|
46
46
|
}),
|
|
47
|
-
date: (format =
|
|
47
|
+
date: (format = "%Y-%m-%d") => (key) => ({ $dateToString: { date: `$${key}`, format } }),
|
|
48
48
|
count: () => ({ $count: {} }),
|
|
49
49
|
sum: (from) => ({ $sum: `$${from}` }),
|
|
50
50
|
avg: (from) => ({ $avg: `$${from}` }),
|
|
@@ -52,42 +52,42 @@ exports.stages = {
|
|
|
52
52
|
last: (from) => ({ $last: `$${from}` }),
|
|
53
53
|
min: (from) => ({ $min: `$${from}` }),
|
|
54
54
|
max: (from) => ({ $max: `$${from}` }),
|
|
55
|
-
push: () => ({ $push:
|
|
55
|
+
push: () => ({ $push: "$$ROOT" })
|
|
56
56
|
},
|
|
57
57
|
search: {
|
|
58
|
-
search: (f) => (
|
|
59
|
-
auto: (value) => (key) => ({ autocomplete: { path: key, query: [
|
|
60
|
-
fuzzy: (value, maxEdits = 1) => (key) => ({
|
|
58
|
+
search: (f) => (0, easy_1.ifDefined)(exports.stages.decode.id(f), $search => ({ $search })),
|
|
59
|
+
auto: (value) => (key) => (0, easy_1.ifDefined)(value, v => ({ autocomplete: { path: key, query: [v] } })),
|
|
60
|
+
fuzzy: (value, maxEdits = 1) => (key) => (0, easy_1.ifDefined)(value, v => ({
|
|
61
61
|
text: {
|
|
62
|
-
query:
|
|
62
|
+
query: v,
|
|
63
63
|
path: key === "wildcard" ? { wildcard: "*" } : key,
|
|
64
64
|
fuzzy: { maxEdits }
|
|
65
65
|
}
|
|
66
|
-
})
|
|
66
|
+
}))
|
|
67
67
|
},
|
|
68
68
|
set: {
|
|
69
69
|
set: (f) => ({ $set: exports.stages.decode.fields(f) }),
|
|
70
|
-
score: () => ({ $meta:
|
|
70
|
+
score: () => ({ $meta: "searchScore" })
|
|
71
71
|
},
|
|
72
72
|
skip: {
|
|
73
73
|
skip: (o = {}) => (0, easy_1.ifDefined)(o.skip, { $skip: (0, easy_1.asNumber)(o.skip) }),
|
|
74
|
-
take: (o = {}) => (0, easy_1.ifDefined)(o.take, { $limit: (0, easy_1.asNumber)(o.take) })
|
|
74
|
+
take: (o = {}) => (0, easy_1.ifDefined)(o.take, { $limit: (0, easy_1.asNumber)(o.take) })
|
|
75
75
|
},
|
|
76
76
|
project: {
|
|
77
77
|
include: (...includes) => (0, easy_1.ifNotEmpty)(includes, es => ({ $project: es.reduce((a, b) => ({ ...a, ...((0, easy_1.isString)(b) ? { [b]: 1 } : b) }), {}) })),
|
|
78
|
-
exclude: (...excludes) => (0, easy_1.ifNotEmpty)(excludes, es => ({ $project: es.reduce((a, b) => ({ ...a, ...((0, easy_1.isString)(b) ? { [b]: 0 } : b) }), {}) }))
|
|
78
|
+
exclude: (...excludes) => (0, easy_1.ifNotEmpty)(excludes, es => ({ $project: es.reduce((a, b) => ({ ...a, ...((0, easy_1.isString)(b) ? { [b]: 0 } : b) }), {}) }))
|
|
79
79
|
},
|
|
80
80
|
replaceWith: {
|
|
81
81
|
replaceWith: (f) => (0, easy_1.ifDefined)(f, { $replaceWith: f }),
|
|
82
82
|
merge: (...objects) => (0, easy_1.ifNotEmpty)(objects, os => ({ $mergeObjects: os })),
|
|
83
83
|
rootAnd: (...objects) => exports.stages.replaceWith.merge(exports.stages.root, ...objects),
|
|
84
|
-
currentAnd: (...objects) => exports.stages.replaceWith.merge(exports.stages.current, ...objects)
|
|
84
|
+
currentAnd: (...objects) => exports.stages.replaceWith.merge(exports.stages.current, ...objects)
|
|
85
85
|
},
|
|
86
86
|
facet: {
|
|
87
87
|
facet: (f) => ({ $facet: exports.stages.decode.fieldsArrays(f) }),
|
|
88
88
|
unwind: (from) => (f) => ({ $unwind: `$${from ?? f}` }),
|
|
89
89
|
count: (from) => (f) => ({ $sortByCount: `$${from ?? f}` }),
|
|
90
|
-
data: () => []
|
|
91
|
-
}
|
|
90
|
+
data: () => []
|
|
91
|
+
}
|
|
92
92
|
};
|
|
93
93
|
//# sourceMappingURL=Stages.js.map
|
package/dist/Stages.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stages.js","sourceRoot":"","sources":["../src/Stages.ts"],"names":[],"mappings":";;;AACA,4CAkB2B;AAC3B,
|
|
1
|
+
{"version":3,"file":"Stages.js","sourceRoot":"","sources":["../src/Stages.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thisisagile/easy-mongo",
|
|
3
|
-
"version": "15.0.
|
|
3
|
+
"version": "15.0.7",
|
|
4
4
|
"description": "Add support for MongoDB",
|
|
5
5
|
"author": "Sander Hoogendoorn",
|
|
6
6
|
"license": "MIT",
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
"access": "public"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@thisisagile/easy-test": "15.0.
|
|
34
|
+
"@thisisagile/easy-test": "15.0.7"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@thisisagile/easy": "^15.0.
|
|
37
|
+
"@thisisagile/easy": "^15.0.7",
|
|
38
38
|
"mongodb": "^5.6.0"
|
|
39
39
|
}
|
|
40
40
|
}
|
package/src/Stages.ts
CHANGED
|
@@ -1,120 +1,120 @@
|
|
|
1
|
-
import {Filter, FindOptions} from
|
|
1
|
+
import { Filter, FindOptions } from "./MongoProvider";
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
} from
|
|
21
|
-
import {toMongoType} from
|
|
3
|
+
asNumber,
|
|
4
|
+
asString,
|
|
5
|
+
Get,
|
|
6
|
+
Id,
|
|
7
|
+
ifDefined,
|
|
8
|
+
ifNotEmpty,
|
|
9
|
+
isFunction,
|
|
10
|
+
isPresent,
|
|
11
|
+
isPrimitive,
|
|
12
|
+
isString,
|
|
13
|
+
meta,
|
|
14
|
+
on,
|
|
15
|
+
OneOrMore,
|
|
16
|
+
Optional,
|
|
17
|
+
PartialRecord,
|
|
18
|
+
toArray,
|
|
19
|
+
use
|
|
20
|
+
} from "@thisisagile/easy";
|
|
21
|
+
import { toMongoType } from "./Utils";
|
|
22
22
|
|
|
23
23
|
export const asc = 1;
|
|
24
24
|
export const desc = -1;
|
|
25
|
-
export type Accumulators =
|
|
25
|
+
export type Accumulators = "$sum" | "$count" | "$avg" | "$first" | "$last" | "$min" | "$max" | "$push";
|
|
26
26
|
export type Accumulator = PartialRecord<Accumulators, Filter>;
|
|
27
27
|
|
|
28
28
|
class FilterBuilder<Options> {
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
constructor(private filters: Partial<Record<keyof Options, (value: unknown) => Filter>>) {
|
|
30
|
+
}
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
from = (q: Partial<Options> = {}): Filter =>
|
|
33
|
+
stages.match.match(meta(q)
|
|
34
|
+
.entries()
|
|
35
|
+
.reduce((acc, [key, value]) => ({ ...acc, ...ifDefined(this.filters[key as keyof Options], f => f(value)) }), {}));
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
const escapeRegex = (s: string) => s.replace(/[|\\{}()[\]^$+*?.]/g,
|
|
38
|
+
const escapeRegex = (s: string) => s.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d");
|
|
39
39
|
|
|
40
40
|
export const stages = {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
41
|
+
root: "$$ROOT",
|
|
42
|
+
current: "$$CURRENT",
|
|
43
|
+
id: "_id",
|
|
44
|
+
decode: {
|
|
45
|
+
fields: (f: Filter) => Object.entries(f).reduce((res, [k, v]) => on(res, r => ifDefined(isFunction(v) ? v(k) : v, nv => (r[k] = nv))), {} as any),
|
|
46
|
+
fieldsArrays: (f: Filter) =>
|
|
47
|
+
Object.entries(f).reduce((res, [k, v]) => on(res, r => (r[k] = use(toArray(v), vs => vs.map(v => (isFunction(v) ? v(k) : v))))), {} as any),
|
|
48
|
+
id: (f: Filter | string) => (isString(f) ? `$${asString(f)}` : isPrimitive(f) ? f : Object.entries(f).map(([k, v]) => (isFunction(v) ? v(k) : v))[0])
|
|
49
|
+
},
|
|
50
|
+
match: {
|
|
51
|
+
match: (f: Record<string, Get<Optional<Filter>, string>>) => ({ $match: stages.decode.fields(f) }),
|
|
52
|
+
filter: <Options>(filters: Partial<Record<keyof Options, (value: unknown) => Filter>>) => new FilterBuilder<Options>(filters),
|
|
53
|
+
gt: (value: Filter) => ({ $gt: value }),
|
|
54
|
+
gte: (value: Filter) => ({ $gte: value }),
|
|
55
|
+
lt: (value: Filter) => ({ $lt: value }),
|
|
56
|
+
lte: (value: Filter) => ({ $lte: value }),
|
|
57
|
+
isIn: (value: OneOrMore<unknown>, separator = ",") => ({ $in: isString(value) ? value.split(separator) : value }),
|
|
58
|
+
after: (date: unknown) => stages.match.gte(toMongoType(date)),
|
|
59
|
+
before: (date: unknown) => stages.match.lt(toMongoType(date)),
|
|
60
|
+
anywhere: (q: string) => ({ $regex: escapeRegex(q), $options: "i" })
|
|
61
|
+
},
|
|
62
|
+
sort: {
|
|
63
|
+
sort: ($sort: Record<string, typeof asc | typeof desc>): Optional<Filter> => (isPresent($sort) ? { $sort } : undefined),
|
|
64
|
+
asc: (key: string) => stages.sort.sort({ [key]: asc }),
|
|
65
|
+
desc: (key: string) => stages.sort.sort({ [key]: desc })
|
|
66
|
+
},
|
|
67
|
+
group: {
|
|
68
|
+
group: (fields: Record<string, Accumulator>) => ({
|
|
69
|
+
by: (by: Filter) => ({ $group: Object.assign({ _id: stages.decode.id(by) }, stages.decode.fields(fields)) })
|
|
70
|
+
}),
|
|
71
|
+
date:
|
|
72
|
+
(format = "%Y-%m-%d") =>
|
|
73
|
+
(key: string) => ({ $dateToString: { date: `$${key}`, format } }),
|
|
74
|
+
count: (): Accumulator => ({ $count: {} }),
|
|
75
|
+
sum: (from?: string): Accumulator => ({ $sum: `$${from}` }),
|
|
76
|
+
avg: (from?: string) => ({ $avg: `$${from}` }),
|
|
77
|
+
first: (from?: string): Accumulator => ({ $first: `$${from}` }),
|
|
78
|
+
last: (from?: string): Accumulator => ({ $last: `$${from}` }),
|
|
79
|
+
min: (from?: string): Accumulator => ({ $min: `$${from}` }),
|
|
80
|
+
max: (from?: string): Accumulator => ({ $max: `$${from}` }),
|
|
81
|
+
push: (): Accumulator => ({ $push: "$$ROOT" })
|
|
82
|
+
},
|
|
83
|
+
search: {
|
|
84
|
+
search: (f: Record<string, Get<Filter, string>>) => ifDefined(stages.decode.id(f), $search => ({ $search })),
|
|
85
|
+
auto: (value?: Id) => (key: string) => ifDefined(value, v => ({ autocomplete: { path: key, query: [v] } })),
|
|
86
|
+
fuzzy: (value?: string, maxEdits = 1) => (key?: string) => ifDefined(value, v => ({
|
|
87
|
+
text: {
|
|
88
|
+
query: v,
|
|
89
|
+
path: key === "wildcard" ? { wildcard: "*" } : key,
|
|
90
|
+
fuzzy: { maxEdits }
|
|
91
|
+
}
|
|
92
|
+
}))
|
|
93
|
+
},
|
|
94
|
+
set: {
|
|
95
|
+
set: (f: Record<string, Get<Filter, string>>) => ({ $set: stages.decode.fields(f) }),
|
|
96
|
+
score: () => ({ $meta: "searchScore" })
|
|
97
|
+
},
|
|
98
|
+
skip: {
|
|
99
|
+
skip: (o: FindOptions = {}): Optional<Filter> => ifDefined(o.skip, { $skip: asNumber(o.skip) }),
|
|
100
|
+
take: (o: FindOptions = {}): Optional<Filter> => ifDefined(o.take, { $limit: asNumber(o.take) })
|
|
101
|
+
},
|
|
102
|
+
project: {
|
|
103
|
+
include: (...includes: (string | Record<string, 1>)[]): Optional<Filter> =>
|
|
104
|
+
ifNotEmpty(includes, es => ({ $project: es.reduce((a: Filter, b: Filter) => ({ ...a, ...(isString(b) ? { [b]: 1 } : b) }), {}) })),
|
|
105
|
+
exclude: (...excludes: (string | Record<string, 0>)[]): Optional<Filter> =>
|
|
106
|
+
ifNotEmpty(excludes, es => ({ $project: es.reduce((a: Filter, b: Filter) => ({ ...a, ...(isString(b) ? { [b]: 0 } : b) }), {}) }))
|
|
107
|
+
},
|
|
108
|
+
replaceWith: {
|
|
109
|
+
replaceWith: (f?: Filter): Optional<Filter> => ifDefined(f, { $replaceWith: f }),
|
|
110
|
+
merge: (...objects: Filter[]): Optional<Filter> => ifNotEmpty(objects, os => ({ $mergeObjects: os })),
|
|
111
|
+
rootAnd: (...objects: Filter[]): Optional<Filter> => stages.replaceWith.merge(stages.root, ...objects),
|
|
112
|
+
currentAnd: (...objects: Filter[]): Optional<Filter> => stages.replaceWith.merge(stages.current, ...objects)
|
|
113
|
+
},
|
|
114
|
+
facet: {
|
|
115
|
+
facet: (f: Record<string, OneOrMore<Get<Optional<Filter>, string>>>) => ({ $facet: stages.decode.fieldsArrays(f) }),
|
|
116
|
+
unwind: (from?: string) => (f?: string) => ({ $unwind: `$${from ?? f}` }),
|
|
117
|
+
count: (from?: string) => (f?: string) => ({ $sortByCount: `$${from ?? f}` }),
|
|
118
|
+
data: () => []
|
|
119
|
+
}
|
|
120
120
|
};
|