forked from mongodb-developer/EDEE_Frontend_Development
-
Notifications
You must be signed in to change notification settings - Fork 0
/
helpers.js
140 lines (124 loc) · 2.03 KB
/
helpers.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//Define helpers for common operators and expressions
const mongo_query_operators = [
"eq",
"gt",
"gte",
"lt",
"lte",
"not",
"ne",
"in",
"nin",
"and",
"regex",
"or",
"nor",
"exists",
"elemMatch",
"expr",
"jsonSchema",
"size",
"type",
];
const mongo_update_operators =[
"set",
"inc",
"push",
"min",
"max",
"unset",
"addToSet"
]
for (let op of mongo_query_operators) {
this[op] = function () {
if (arguments.length == 1) {
return new Document({ [`$${op}`]: arguments[0] });
} else {
if (arguments.length == 2) {
return new Document({ [`${arguments[0]}`]: { [`$${op}`]: arguments[1] } });
} else {
return new Document({ [`${arguments[0]}`]: { [`$${op}`]: [...arguments].shift() }})
}
}
};
}
for (let op of mongo_update_operators) {
this[op] = function () {
if (arguments.length == 2) {
return new Document({ [`$${op}`]: { [`${arguments[0]}`]: arguments[1] } });
} else {
throw new Error(`${op} takes 2 arguments`);
}
};
}
function empty() { return {} }
function combine() {
const rval = {}
for(update of arguments) {
// op will be something like {$set:{a:1}} and we need ot merge them
for( op in update) {
rval[op] = { ...update[op],...rval[op]}
}
}
return new Document(rval);
}
function include() {
const rval = new Document();
for(let arg of arguments) {
rval[arg] = true;
}
return rval;
}
function exclude() {
const rval = new Document();
for(let arg of arguments) {
rval[arg] = false;
}
return rval;
}
function fields() {
rval = new Document()
for(let arg of arguments) {
rval = { ...rval, ...arg }
}
return rval;
}
const Projections = {
fields,
include,
exclude
}
const Updates = {
combine,
inc,
push,
set,
min,
max,
unset,
addToSet
}
const Filters = {
empty,
eq,
gt,
gte,
lt,
lte,
not,
ne,
in: this.in,
nin,
and,
regex,
or,
nor,
exists,
elemMatch,
expr,
jsonSchema,
size,
type,
and,
or
}