Skip to content

Commit 4b9ab80

Browse files
committed
Add support for $pullAll update operator
1 parent 1ca4464 commit 4b9ab80

File tree

9 files changed

+449
-91
lines changed

9 files changed

+449
-91
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ The following expression operators are supported: `$literal`, `$add`, `$subtract
8383

8484
### Update Operators
8585

86-
The following update operators are supported: `$set`, `$unset`, `$rename`, `$inc`, `$mul`, `$min`, `$max`, `$push`, `$pop`, `$pull`, and `$addToSet`.
86+
The following update operators are supported: `$set`, `$unset`, `$rename`, `$inc`, `$mul`, `$min`, `$max`, `$push`, `$pop`, `$pullAll`, `$pull`, and `$addToSet`.
8787

8888
### Group Operators
8989

build/src/update.js

Lines changed: 131 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ var set = _require.set;
88
var modify = _require.modify;
99
var remove1 = _require.remove1;
1010
var rename = _require.rename;
11+
var equal = _require.equal;
1112
var unknownOp = _require.unknownOp;
1213
var getIDBError = _require.getIDBError;
1314

@@ -124,6 +125,121 @@ var $pop = function $pop(path_pieces, direction) {
124125
};
125126
};
126127

128+
var $pullAll = function $pullAll(path_pieces, values) {
129+
return function (doc) {
130+
get(doc, path_pieces, function (obj, field) {
131+
var elements = obj[field];
132+
if (!Array.isArray(elements)) {
133+
return;
134+
}
135+
136+
var new_elements = [];
137+
138+
var hasValue = function hasValue(value1) {
139+
var _iteratorNormalCompletion = true;
140+
var _didIteratorError = false;
141+
var _iteratorError = undefined;
142+
143+
try {
144+
for (var _iterator = values[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
145+
var value2 = _step.value;
146+
147+
if (equal(value1, value2)) {
148+
return true;
149+
}
150+
}
151+
} catch (err) {
152+
_didIteratorError = true;
153+
_iteratorError = err;
154+
} finally {
155+
try {
156+
if (!_iteratorNormalCompletion && _iterator.return) {
157+
_iterator.return();
158+
}
159+
} finally {
160+
if (_didIteratorError) {
161+
throw _iteratorError;
162+
}
163+
}
164+
}
165+
};
166+
167+
var _iteratorNormalCompletion2 = true;
168+
var _didIteratorError2 = false;
169+
var _iteratorError2 = undefined;
170+
171+
try {
172+
for (var _iterator2 = elements[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
173+
var element = _step2.value;
174+
175+
if (!hasValue(element)) {
176+
new_elements.push(element);
177+
}
178+
}
179+
} catch (err) {
180+
_didIteratorError2 = true;
181+
_iteratorError2 = err;
182+
} finally {
183+
try {
184+
if (!_iteratorNormalCompletion2 && _iterator2.return) {
185+
_iterator2.return();
186+
}
187+
} finally {
188+
if (_didIteratorError2) {
189+
throw _iteratorError2;
190+
}
191+
}
192+
}
193+
194+
obj[field] = new_elements;
195+
});
196+
};
197+
};
198+
199+
var $pull = function $pull(path_pieces, value) {
200+
return $pullAll(path_pieces, [value]);
201+
};
202+
203+
var $addToSet = function $addToSet(path_pieces, value) {
204+
return function (doc) {
205+
get(doc, path_pieces, function (obj, field) {
206+
var elements = obj[field];
207+
if (!Array.isArray(elements)) {
208+
return;
209+
}
210+
211+
var _iteratorNormalCompletion3 = true;
212+
var _didIteratorError3 = false;
213+
var _iteratorError3 = undefined;
214+
215+
try {
216+
for (var _iterator3 = elements[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
217+
var el = _step3.value;
218+
219+
if (equal(el, value)) {
220+
return;
221+
}
222+
}
223+
} catch (err) {
224+
_didIteratorError3 = true;
225+
_iteratorError3 = err;
226+
} finally {
227+
try {
228+
if (!_iteratorNormalCompletion3 && _iterator3.return) {
229+
_iterator3.return();
230+
}
231+
} finally {
232+
if (_didIteratorError3) {
233+
throw _iteratorError3;
234+
}
235+
}
236+
}
237+
238+
elements.push(value);
239+
});
240+
};
241+
};
242+
127243
var ops = {
128244
$set: $set,
129245
$unset: $unset,
@@ -133,7 +249,10 @@ var ops = {
133249
$min: $min,
134250
$max: $max,
135251
$push: $push,
136-
$pop: $pop
252+
$pop: $pop,
253+
$pullAll: $pullAll,
254+
$pull: $pull,
255+
$addToSet: $addToSet
137256
};
138257

139258
var build = function build(steps, field, value) {
@@ -168,26 +287,26 @@ module.exports = function (cur, spec, cb) {
168287
return cb(error);
169288
}
170289

171-
var _iteratorNormalCompletion = true;
172-
var _didIteratorError = false;
173-
var _iteratorError = undefined;
290+
var _iteratorNormalCompletion4 = true;
291+
var _didIteratorError4 = false;
292+
var _iteratorError4 = undefined;
174293

175294
try {
176-
for (var _iterator = steps[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
177-
var fn = _step.value;
295+
for (var _iterator4 = steps[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
296+
var fn = _step4.value;
178297
fn(doc);
179298
}
180299
} catch (err) {
181-
_didIteratorError = true;
182-
_iteratorError = err;
300+
_didIteratorError4 = true;
301+
_iteratorError4 = err;
183302
} finally {
184303
try {
185-
if (!_iteratorNormalCompletion && _iterator.return) {
186-
_iterator.return();
304+
if (!_iteratorNormalCompletion4 && _iterator4.return) {
305+
_iterator4.return();
187306
}
188307
} finally {
189-
if (_didIteratorError) {
190-
throw _iteratorError;
308+
if (_didIteratorError4) {
309+
throw _iteratorError4;
191310
}
192311
}
193312
}

build/test/update.js

Lines changed: 59 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ var col = db.collection('col');
1111
var doc = {
1212
k: 3,
1313
t: 4,
14-
a: [3, 4],
14+
a: [3, 4, 8],
1515
n: [8, 2],
1616
m: { x: 80 }
1717
};
@@ -50,7 +50,7 @@ it('should set the value of a field without $set', function (done) {
5050
x: 10,
5151
k: 3,
5252
t: 4,
53-
a: [3, 4],
53+
a: [3, 4, 8],
5454
n: [8, 2],
5555
m: { x: 80 }
5656
}, done);
@@ -64,7 +64,7 @@ describe('$set', function () {
6464
x: 30,
6565
k: 3,
6666
t: 4,
67-
a: [3, 4],
67+
a: [3, 4, 8],
6868
n: [8, 2],
6969
m: { x: 80 }
7070
}, done);
@@ -76,7 +76,7 @@ describe('$set', function () {
7676
}, {
7777
k: 3,
7878
t: 4,
79-
a: [3, 4],
79+
a: [3, 4, 8],
8080
n: [8, 2],
8181
m: { x: 30 }
8282
}, done);
@@ -89,7 +89,7 @@ describe('$unset', function () {
8989
$unset: { k: 1 }
9090
}, {
9191
t: 4,
92-
a: [3, 4],
92+
a: [3, 4, 8],
9393
n: [8, 2],
9494
m: { x: 80 }
9595
}, done);
@@ -101,7 +101,7 @@ describe('$unset', function () {
101101
}, {
102102
k: 3,
103103
t: 4,
104-
a: [3, 4],
104+
a: [3, 4, 8],
105105
n: [8, 2],
106106
m: {}
107107
}, done);
@@ -115,7 +115,7 @@ describe('$rename', function () {
115115
}, {
116116
g: 3,
117117
t: 4,
118-
a: [3, 4],
118+
a: [3, 4, 8],
119119
n: [8, 2],
120120
m: { x: 80 }
121121
}, done);
@@ -127,7 +127,7 @@ describe('$rename', function () {
127127
}, {
128128
k: 3,
129129
t: 4,
130-
a: [3, 4],
130+
a: [3, 4, 8],
131131
n: [8, 2],
132132
m: { g: 80 }
133133
}, done);
@@ -141,7 +141,7 @@ describe('$inc', function () {
141141
}, {
142142
k: 5,
143143
t: 4,
144-
a: [3, 4],
144+
a: [3, 4, 8],
145145
n: [8, 2],
146146
m: { x: 80 }
147147
}, done);
@@ -153,7 +153,7 @@ describe('$inc', function () {
153153
}, {
154154
k: 3,
155155
t: 4,
156-
a: [3, 4],
156+
a: [3, 4, 8],
157157
n: [8, 2],
158158
m: { x: 82 }
159159
}, done);
@@ -167,7 +167,7 @@ describe('$mul', function () {
167167
}, {
168168
k: 6,
169169
t: 4,
170-
a: [3, 4],
170+
a: [3, 4, 8],
171171
n: [8, 2],
172172
m: { x: 80 }
173173
}, done);
@@ -179,7 +179,7 @@ describe('$mul', function () {
179179
}, {
180180
k: 3,
181181
t: 4,
182-
a: [3, 4],
182+
a: [3, 4, 8],
183183
n: [8, 2],
184184
m: { x: 160 }
185185
}, done);
@@ -193,7 +193,7 @@ describe('$min', function () {
193193
}, {
194194
k: 3,
195195
t: 1,
196-
a: [3, 4],
196+
a: [3, 4, 8],
197197
n: [8, 2],
198198
m: { x: 80 }
199199
}, done);
@@ -207,7 +207,7 @@ describe('$max', function () {
207207
}, {
208208
k: 3,
209209
t: 10,
210-
a: [3, 4],
210+
a: [3, 4, 8],
211211
n: [8, 2],
212212
m: { x: 80 }
213213
}, done);
@@ -221,23 +221,65 @@ describe('$push', function () {
221221
}, {
222222
k: 3,
223223
t: 4,
224-
a: [3, 4, 9],
224+
a: [3, 4, 8, 9],
225225
n: [8, 2],
226226
m: { x: 80 }
227227
}, done);
228228
});
229229
});
230230

231231
describe('$pop', function () {
232-
it('should remove a value of an array', function (done) {
232+
it('should remove the first or last element of an array', function (done) {
233233
update({
234234
$pop: { a: 1, n: -1 }
235235
}, {
236236
k: 3,
237237
t: 4,
238-
a: [3],
238+
a: [3, 4],
239239
n: [2],
240240
m: { x: 80 }
241241
}, done);
242242
});
243+
});
244+
245+
describe('$pullAll', function () {
246+
it('', function (done) {
247+
update({
248+
$pullAll: { a: [3, 8] }
249+
}, {
250+
k: 3,
251+
t: 4,
252+
a: [4],
253+
n: [8, 2],
254+
m: { x: 80 }
255+
}, done);
256+
});
257+
});
258+
259+
describe('$pull', function () {
260+
it('should remove instances of a value from an array', function (done) {
261+
update({
262+
$pull: { a: 4 }
263+
}, {
264+
k: 3,
265+
t: 4,
266+
a: [3, 8],
267+
n: [8, 2],
268+
m: { x: 80 }
269+
}, done);
270+
});
271+
});
272+
273+
describe('$addToSet', function () {
274+
it('should add a unique value to an array', function (done) {
275+
update({
276+
$addToSet: { a: 3, n: 4 }
277+
}, {
278+
k: 3,
279+
t: 4,
280+
a: [3, 4, 8],
281+
n: [8, 2, 4],
282+
m: { x: 80 }
283+
}, done);
284+
});
243285
});

0 commit comments

Comments
 (0)