@feathersjs/mongodb 5.0.24 → 5.0.26

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/CHANGELOG.md CHANGED
@@ -3,6 +3,17 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09)
7
+
8
+ ### Bug Fixes
9
+
10
+ - **mongodb:** Added Update Method Prototype to MongoDBService Class ([#3494](https://github.com/feathersjs/feathers/issues/3494)) ([428f23a](https://github.com/feathersjs/feathers/commit/428f23a8c622cd8bc4d06253206aadd514267846))
11
+ - **mongodb:** MongoDB Aggregation improvements ([#3366](https://github.com/feathersjs/feathers/issues/3366)) ([f2829b1](https://github.com/feathersjs/feathers/commit/f2829b1f8e33d13caae3557d37225d990467fb39))
12
+
13
+ ## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03)
14
+
15
+ **Note:** Version bump only for package @feathersjs/mongodb
16
+
6
17
  ## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13)
7
18
 
8
19
  **Note:** Version bump only for package @feathersjs/mongodb
package/lib/adapter.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ObjectId, Collection, FindOptions, BulkWriteOptions, InsertOneOptions, DeleteOptions, CountDocumentsOptions, ReplaceOptions, Document } from 'mongodb';
1
+ import { ObjectId, Collection, FindOptions, BulkWriteOptions, InsertOneOptions, DeleteOptions, CountDocumentsOptions, ReplaceOptions, FindOneAndReplaceOptions, Document, FindOneAndDeleteOptions } from 'mongodb';
2
2
  import { AdapterBase, AdapterParams, AdapterServiceOptions, PaginationOptions, AdapterQuery } from '@feathersjs/adapter-commons';
3
3
  import { Id, Paginated } from '@feathersjs/feathers';
4
4
  export interface MongoDBAdapterOptions extends AdapterServiceOptions {
@@ -8,7 +8,7 @@ export interface MongoDBAdapterOptions extends AdapterServiceOptions {
8
8
  }
9
9
  export interface MongoDBAdapterParams<Q = AdapterQuery> extends AdapterParams<Q, Partial<MongoDBAdapterOptions>> {
10
10
  pipeline?: Document[];
11
- mongodb?: BulkWriteOptions | FindOptions | InsertOneOptions | DeleteOptions | CountDocumentsOptions | ReplaceOptions;
11
+ mongodb?: BulkWriteOptions | FindOptions | InsertOneOptions | DeleteOptions | CountDocumentsOptions | ReplaceOptions | FindOneAndReplaceOptions | FindOneAndDeleteOptions;
12
12
  }
13
13
  export type AdapterId = Id | ObjectId;
14
14
  export type NullableAdapterId = AdapterId | null;
@@ -32,13 +32,13 @@ export declare class MongoDbAdapter<Result, Data = Partial<Result>, ServiceParam
32
32
  findRaw(params: ServiceParams): Promise<import("mongodb").FindCursor<import("mongodb").WithId<Document>>>;
33
33
  aggregateRaw(params: ServiceParams): Promise<import("mongodb").AggregationCursor<Document>>;
34
34
  makeFeathersPipeline(params: ServiceParams): Document[];
35
- getSelect(select: string[] | {
35
+ getProjection(select?: string[] | {
36
36
  [key: string]: number;
37
37
  }): {
38
38
  [key: string]: number;
39
39
  };
40
- _findOrGet(id: NullableAdapterId, params: ServiceParams): Promise<Result | Paginated<Result> | Result[]>;
41
40
  normalizeId<D>(id: NullableAdapterId, data: D): D;
41
+ countDocuments(params: ServiceParams): Promise<number>;
42
42
  _get(id: AdapterId, params?: ServiceParams): Promise<Result>;
43
43
  _find(params?: ServiceParams & {
44
44
  paginate?: PaginationOptions;
package/lib/adapter.js CHANGED
@@ -50,13 +50,13 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
50
50
  async findRaw(params) {
51
51
  const { filters, query } = this.filterQuery(null, params);
52
52
  const model = await this.getModel(params);
53
- const q = model.find(query, { ...params.mongodb });
54
- if (filters.$select !== undefined) {
55
- q.project(this.getSelect(filters.$select));
56
- }
53
+ const q = model.find(query, params.mongodb);
57
54
  if (filters.$sort !== undefined) {
58
55
  q.sort(filters.$sort);
59
56
  }
57
+ if (filters.$select !== undefined) {
58
+ q.project(this.getProjection(filters.$select));
59
+ }
60
60
  if (filters.$skip !== undefined) {
61
61
  q.skip(filters.$skip);
62
62
  }
@@ -65,6 +65,7 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
65
65
  }
66
66
  return q;
67
67
  }
68
+ /* TODO: Remove $out and $merge stages, else it returns an empty cursor. I think its safe to assume this is primarily for querying. */
68
69
  async aggregateRaw(params) {
69
70
  const model = await this.getModel(params);
70
71
  const pipeline = params.pipeline || [];
@@ -72,17 +73,17 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
72
73
  const before = index >= 0 ? pipeline.slice(0, index) : [];
73
74
  const feathersPipeline = this.makeFeathersPipeline(params);
74
75
  const after = index >= 0 ? pipeline.slice(index + 1) : pipeline;
75
- return model.aggregate([...before, ...feathersPipeline, ...after]);
76
+ return model.aggregate([...before, ...feathersPipeline, ...after], params.mongodb);
76
77
  }
77
78
  makeFeathersPipeline(params) {
78
79
  const { filters, query } = this.filterQuery(null, params);
79
80
  const pipeline = [{ $match: query }];
80
- if (filters.$select !== undefined) {
81
- pipeline.push({ $project: this.getSelect(filters.$select) });
82
- }
83
81
  if (filters.$sort !== undefined) {
84
82
  pipeline.push({ $sort: filters.$sort });
85
83
  }
84
+ if (filters.$select !== undefined) {
85
+ pipeline.push({ $project: this.getProjection(filters.$select) });
86
+ }
86
87
  if (filters.$skip !== undefined) {
87
88
  pipeline.push({ $skip: filters.$skip });
88
89
  }
@@ -91,7 +92,10 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
91
92
  }
92
93
  return pipeline;
93
94
  }
94
- getSelect(select) {
95
+ getProjection(select) {
96
+ if (!select) {
97
+ return undefined;
98
+ }
95
99
  if (Array.isArray(select)) {
96
100
  if (!select.includes(this.id)) {
97
101
  select = [this.id, ...select];
@@ -109,9 +113,6 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
109
113
  }
110
114
  return select;
111
115
  }
112
- async _findOrGet(id, params) {
113
- return id === null ? await this._find(params) : await this._get(id, params);
114
- }
115
116
  normalizeId(id, data) {
116
117
  if (this.id === '_id') {
117
118
  // Default Mongo IDs cannot be updated. The Mongo library handles
@@ -128,64 +129,105 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
128
129
  }
129
130
  return data;
130
131
  }
132
+ async countDocuments(params) {
133
+ const { useEstimatedDocumentCount } = this.getOptions(params);
134
+ const { query } = this.filterQuery(null, params);
135
+ if (params.pipeline) {
136
+ const aggregateParams = {
137
+ ...params,
138
+ query: {
139
+ ...params.query,
140
+ $select: [this.id],
141
+ $sort: undefined,
142
+ $skip: undefined,
143
+ $limit: undefined
144
+ }
145
+ };
146
+ const result = await this.aggregateRaw(aggregateParams).then((result) => result.toArray());
147
+ return result.length;
148
+ }
149
+ const model = await this.getModel(params);
150
+ if (useEstimatedDocumentCount && typeof model.estimatedDocumentCount === 'function') {
151
+ return model.estimatedDocumentCount();
152
+ }
153
+ return model.countDocuments(query, params.mongodb);
154
+ }
131
155
  async _get(id, params = {}) {
132
156
  const { query, filters: { $select } } = this.filterQuery(id, params);
133
- const projection = $select
134
- ? {
135
- projection: {
136
- ...this.getSelect($select),
137
- [this.id]: 1
157
+ if (params.pipeline) {
158
+ const aggregateParams = {
159
+ ...params,
160
+ query: {
161
+ ...params.query,
162
+ $limit: 1,
163
+ $and: (params.query.$and || []).concat({
164
+ [this.id]: this.getObjectId(id)
165
+ })
138
166
  }
139
- }
140
- : {};
167
+ };
168
+ return this.aggregateRaw(aggregateParams)
169
+ .then((result) => result.toArray())
170
+ .then(([result]) => {
171
+ if (!result) {
172
+ throw new errors_1.NotFound(`No record found for id '${id}'`);
173
+ }
174
+ return result;
175
+ })
176
+ .catch(error_handler_1.errorHandler);
177
+ }
141
178
  const findOptions = {
142
- ...params.mongodb,
143
- ...projection
179
+ projection: this.getProjection($select),
180
+ ...params.mongodb
144
181
  };
145
182
  return this.getModel(params)
146
183
  .then((model) => model.findOne(query, findOptions))
147
- .then((data) => {
148
- if (data == null) {
184
+ .then((result) => {
185
+ if (!result) {
149
186
  throw new errors_1.NotFound(`No record found for id '${id}'`);
150
187
  }
151
- return data;
188
+ return result;
152
189
  })
153
190
  .catch(error_handler_1.errorHandler);
154
191
  }
155
192
  async _find(params = {}) {
156
- const { paginate, useEstimatedDocumentCount } = this.getOptions(params);
157
- const { filters, query } = this.filterQuery(null, params);
158
- const useAggregation = !params.mongodb && filters.$limit !== 0;
159
- const countDocuments = async () => {
160
- if (paginate && paginate.default) {
161
- const model = await this.getModel(params);
162
- if (useEstimatedDocumentCount && typeof model.estimatedDocumentCount === 'function') {
163
- return model.estimatedDocumentCount();
164
- }
165
- else {
166
- return model.countDocuments(query, { ...params.mongodb });
167
- }
168
- }
169
- return Promise.resolve(0);
193
+ const { paginate } = this.getOptions(params);
194
+ const { filters } = this.filterQuery(null, params);
195
+ const paginationDisabled = params.paginate === false || !paginate || !paginate.default;
196
+ const getData = () => {
197
+ const result = params.pipeline ? this.aggregateRaw(params) : this.findRaw(params);
198
+ return result.then((result) => result.toArray());
170
199
  };
171
- const [request, total] = await Promise.all([
172
- useAggregation ? this.aggregateRaw(params) : this.findRaw(params),
173
- countDocuments()
174
- ]);
175
- const page = {
200
+ if (paginationDisabled) {
201
+ if (filters.$limit === 0) {
202
+ return [];
203
+ }
204
+ const data = await getData();
205
+ return data;
206
+ }
207
+ if (filters.$limit === 0) {
208
+ return {
209
+ total: await this.countDocuments(params),
210
+ data: [],
211
+ limit: filters.$limit,
212
+ skip: filters.$skip || 0
213
+ };
214
+ }
215
+ const [data, total] = await Promise.all([getData(), this.countDocuments(params)]);
216
+ return {
176
217
  total,
218
+ data: data,
177
219
  limit: filters.$limit,
178
- skip: filters.$skip || 0,
179
- data: filters.$limit === 0 ? [] : (await request.toArray())
220
+ skip: filters.$skip || 0
180
221
  };
181
- return paginate && paginate.default ? page : page.data;
182
222
  }
183
223
  async _create(data, params = {}) {
184
- const writeOptions = params.mongodb;
224
+ var _a, _b;
225
+ if (Array.isArray(data) && !this.allowsMulti('create', params)) {
226
+ throw new errors_1.MethodNotAllowed('Can not create multiple entries');
227
+ }
185
228
  const model = await this.getModel(params);
186
229
  const setId = (item) => {
187
230
  const entry = Object.assign({}, item);
188
- // Generate a MongoId if we use a custom id
189
231
  if (this.id !== '_id' && typeof entry[this.id] === 'undefined') {
190
232
  return {
191
233
  [this.id]: new mongodb_1.ObjectId().toHexString(),
@@ -194,14 +236,28 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
194
236
  }
195
237
  return entry;
196
238
  };
197
- const promise = Array.isArray(data)
198
- ? model
199
- .insertMany(data.map(setId), writeOptions)
200
- .then(async (result) => model.find({ _id: { $in: Object.values(result.insertedIds) } }, params.mongodb).toArray())
201
- : model
202
- .insertOne(setId(data), writeOptions)
203
- .then(async (result) => model.findOne({ _id: result.insertedId }, params.mongodb));
204
- return promise.then((0, adapter_commons_1.select)(params, this.id)).catch(error_handler_1.errorHandler);
239
+ if (Array.isArray(data)) {
240
+ const created = await model.insertMany(data.map(setId), params.mongodb).catch(error_handler_1.errorHandler);
241
+ return this._find({
242
+ ...params,
243
+ paginate: false,
244
+ query: {
245
+ _id: { $in: Object.values(created.insertedIds) },
246
+ $select: (_a = params.query) === null || _a === void 0 ? void 0 : _a.$select
247
+ }
248
+ });
249
+ }
250
+ const created = await model.insertOne(setId(data), params.mongodb).catch(error_handler_1.errorHandler);
251
+ const result = await this._find({
252
+ ...params,
253
+ paginate: false,
254
+ query: {
255
+ _id: created.insertedId,
256
+ $select: (_b = params.query) === null || _b === void 0 ? void 0 : _b.$select,
257
+ $limit: 1
258
+ }
259
+ });
260
+ return result[0];
205
261
  }
206
262
  async _patch(id, _data, params = {}) {
207
263
  if (id === null && !this.allowsMulti('patch', params)) {
@@ -209,71 +265,160 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
209
265
  }
210
266
  const data = this.normalizeId(id, _data);
211
267
  const model = await this.getModel(params);
212
- const { query, filters: { $select } } = this.filterQuery(id, params);
213
- const updateOptions = { ...params.mongodb };
214
- const modifier = Object.keys(data).reduce((current, key) => {
268
+ const { query, filters: { $sort, $select } } = this.filterQuery(id, params);
269
+ const replacement = Object.keys(data).reduce((current, key) => {
215
270
  const value = data[key];
216
271
  if (key.charAt(0) !== '$') {
272
+ current.$set[key] = value;
273
+ }
274
+ else if (key === '$set') {
217
275
  current.$set = {
218
276
  ...current.$set,
219
- [key]: value
277
+ ...value
220
278
  };
221
279
  }
222
280
  else {
223
281
  current[key] = value;
224
282
  }
225
283
  return current;
226
- }, {});
227
- const originalIds = await this._findOrGet(id, {
228
- ...params,
229
- query: {
230
- ...query,
231
- $select: [this.id]
232
- },
233
- paginate: false
234
- });
235
- const items = Array.isArray(originalIds) ? originalIds : [originalIds];
236
- const idList = items.map((item) => item[this.id]);
237
- const findParams = {
238
- ...params,
239
- paginate: false,
240
- query: {
241
- [this.id]: { $in: idList },
242
- $select
243
- }
284
+ }, { $set: {} });
285
+ if (id === null) {
286
+ const findParams = {
287
+ ...params,
288
+ paginate: false,
289
+ query: {
290
+ ...params.query,
291
+ $select: [this.id]
292
+ }
293
+ };
294
+ return this._find(findParams)
295
+ .then(async (result) => {
296
+ const idList = result.map((item) => item[this.id]);
297
+ await model.updateMany({ [this.id]: { $in: idList } }, replacement, params.mongodb);
298
+ return this._find({
299
+ ...params,
300
+ paginate: false,
301
+ query: {
302
+ [this.id]: { $in: idList },
303
+ $sort,
304
+ $select
305
+ }
306
+ });
307
+ })
308
+ .catch(error_handler_1.errorHandler);
309
+ }
310
+ if (params.pipeline) {
311
+ const getParams = {
312
+ ...params,
313
+ query: {
314
+ ...params.query,
315
+ $select: [this.id]
316
+ }
317
+ };
318
+ return this._get(id, getParams)
319
+ .then(async () => {
320
+ await model.updateOne({ [this.id]: id }, replacement, params.mongodb);
321
+ return this._get(id, {
322
+ ...params,
323
+ query: { $select }
324
+ });
325
+ })
326
+ .catch(error_handler_1.errorHandler);
327
+ }
328
+ const updateOptions = {
329
+ projection: this.getProjection($select),
330
+ ...params.mongodb,
331
+ returnDocument: 'after'
244
332
  };
245
- await model.updateMany(query, modifier, updateOptions);
246
- return this._findOrGet(id, findParams).catch(error_handler_1.errorHandler);
333
+ return model
334
+ .findOneAndUpdate(query, replacement, updateOptions)
335
+ .then((result) => {
336
+ if (!result) {
337
+ throw new errors_1.NotFound(`No record found for id '${id}'`);
338
+ }
339
+ return result;
340
+ })
341
+ .catch(error_handler_1.errorHandler);
247
342
  }
248
343
  async _update(id, data, params = {}) {
249
344
  if (id === null || Array.isArray(data)) {
250
345
  throw new errors_1.BadRequest("You can not replace multiple instances. Did you mean 'patch'?");
251
346
  }
347
+ const { query, filters: { $select } } = this.filterQuery(id, params);
252
348
  const model = await this.getModel(params);
253
- const { query } = this.filterQuery(id, params);
254
- const replaceOptions = { ...params.mongodb };
255
- await model.replaceOne(query, this.normalizeId(id, data), replaceOptions);
256
- return this._findOrGet(id, params).catch(error_handler_1.errorHandler);
349
+ const replacement = this.normalizeId(id, data);
350
+ if (params.pipeline) {
351
+ const getParams = {
352
+ ...params,
353
+ query: {
354
+ ...params.query,
355
+ $select: [this.id]
356
+ }
357
+ };
358
+ return this._get(id, getParams)
359
+ .then(async () => {
360
+ await model.replaceOne({ [this.id]: id }, replacement, params.mongodb);
361
+ return this._get(id, {
362
+ ...params,
363
+ query: { $select }
364
+ });
365
+ })
366
+ .catch(error_handler_1.errorHandler);
367
+ }
368
+ const replaceOptions = {
369
+ projection: this.getProjection($select),
370
+ ...params.mongodb,
371
+ returnDocument: 'after'
372
+ };
373
+ return model
374
+ .findOneAndReplace(query, replacement, replaceOptions)
375
+ .then((result) => {
376
+ if (!result) {
377
+ throw new errors_1.NotFound(`No record found for id '${id}'`);
378
+ }
379
+ return result;
380
+ })
381
+ .catch(error_handler_1.errorHandler);
257
382
  }
258
383
  async _remove(id, params = {}) {
384
+ var _a;
259
385
  if (id === null && !this.allowsMulti('remove', params)) {
260
386
  throw new errors_1.MethodNotAllowed('Can not remove multiple entries');
261
387
  }
262
388
  const model = await this.getModel(params);
263
- const { query, filters: { $select } } = this.filterQuery(id, params);
264
- const deleteOptions = { ...params.mongodb };
389
+ const { query } = this.filterQuery(id, params);
265
390
  const findParams = {
266
391
  ...params,
267
- paginate: false,
268
- query: {
269
- ...query,
270
- $select
271
- }
392
+ paginate: false
393
+ };
394
+ if (id === null) {
395
+ return this._find(findParams)
396
+ .then(async (result) => {
397
+ const idList = result.map((item) => item[this.id]);
398
+ await model.deleteMany({ [this.id]: { $in: idList } }, params.mongodb);
399
+ return result;
400
+ })
401
+ .catch(error_handler_1.errorHandler);
402
+ }
403
+ if (params.pipeline) {
404
+ return this._get(id, params)
405
+ .then(async (result) => {
406
+ await model.deleteOne({ [this.id]: id }, params.mongodb);
407
+ return result;
408
+ })
409
+ .catch(error_handler_1.errorHandler);
410
+ }
411
+ const deleteOptions = {
412
+ ...params.mongodb,
413
+ projection: this.getProjection((_a = params.query) === null || _a === void 0 ? void 0 : _a.$select)
272
414
  };
273
- return this._findOrGet(id, findParams)
274
- .then(async (items) => {
275
- await model.deleteMany(query, deleteOptions);
276
- return items;
415
+ return model
416
+ .findOneAndDelete(query, deleteOptions)
417
+ .then((result) => {
418
+ if (!result) {
419
+ throw new errors_1.NotFound(`No record found for id '${id}'`);
420
+ }
421
+ return result;
277
422
  })
278
423
  .catch(error_handler_1.errorHandler);
279
424
  }
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -16,7 +16,7 @@ export declare class MongoDBService<Result = any, Data = Partial<Result>, Servic
16
16
  create(data: Data, params?: ServiceParams): Promise<Result>;
17
17
  create(data: Data[], params?: ServiceParams): Promise<Result[]>;
18
18
  create(data: Data | Data[], params?: ServiceParams): Promise<Result | Result[]>;
19
- update(id: AdapterId, data: Data, params?: ServiceParams): Promise<Result>;
19
+ update(id: NullableAdapterId, data: Data, params?: ServiceParams): Promise<Result>;
20
20
  patch(id: null, data: PatchData, params?: ServiceParams): Promise<Result[]>;
21
21
  patch(id: AdapterId, data: PatchData, params?: ServiceParams): Promise<Result>;
22
22
  patch(id: NullableAdapterId, data: PatchData, params?: ServiceParams): Promise<Result | Result[]>;
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,gDAAyD;AAEzD,uCAA8F;AAE9F,4CAAyB;AACzB,kDAA+B;AAC/B,+CAA4B;AAE5B,MAAa,cAKX,SAAQ,wBAAsD;IAI9D,KAAK,CAAC,IAAI,CAAC,MAAsB;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;SACxC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAa,EAAE,MAAsB;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;YACnB,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;SACxC,CAAC,CAAA;IACJ,CAAC;IAKD,KAAK,CAAC,MAAM,CAAC,IAAmB,EAAE,MAAsB;QACtD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,sBAAgB,CAAC,iCAAiC,CAAC,CAAA;QAC/D,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAa,EAAE,IAAU,EAAE,MAAsB;QAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE;YAC5B,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;SACxC,CAAC,CAAA;IACJ,CAAC;IAKD,KAAK,CAAC,KAAK,CAAC,EAAqB,EAAE,IAAe,EAAE,MAAsB;QACxE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QAE7D,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE;YAC3B,GAAG,MAAM;YACT,KAAK;SACN,CAAC,CAAA;IACJ,CAAC;IAKD,KAAK,CAAC,MAAM,CAAC,EAAqB,EAAE,MAAsB;QACxD,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QAE7D,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE;YACtB,GAAG,MAAM;YACT,KAAK;SACN,CAAC,CAAA;IACJ,CAAC;CACF;AAhED,wCAgEC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,gDAAyD;AAEzD,uCAA8F;AAE9F,4CAAyB;AACzB,kDAA+B;AAC/B,+CAA4B;AAE5B,MAAa,cAKX,SAAQ,wBAAsD;IAI9D,KAAK,CAAC,IAAI,CAAC,MAAsB;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;SACxC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAa,EAAE,MAAsB;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;YACnB,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;SACxC,CAAC,CAAA;IACJ,CAAC;IAKD,KAAK,CAAC,MAAM,CAAC,IAAmB,EAAE,MAAsB;QACtD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,sBAAgB,CAAC,iCAAiC,CAAC,CAAA;QAC/D,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC;IAGD,KAAK,CAAC,MAAM,CAAC,EAAa,EAAE,IAAU,EAAE,MAAsB;QAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE;YAC5B,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;SACxC,CAAC,CAAA;IACJ,CAAC;IAKD,KAAK,CAAC,KAAK,CAAC,EAAqB,EAAE,IAAe,EAAE,MAAsB;QACxE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QAE7D,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE;YAC3B,GAAG,MAAM;YACT,KAAK;SACN,CAAC,CAAA;IACJ,CAAC;IAKD,KAAK,CAAC,MAAM,CAAC,EAAqB,EAAE,MAAsB;QACxD,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QAE7D,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE;YACtB,GAAG,MAAM;YACT,KAAK;SACN,CAAC,CAAA;IACJ,CAAC;CACF;AAjED,wCAiEC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@feathersjs/mongodb",
3
3
  "description": "Feathers MongoDB service adapter",
4
- "version": "5.0.24",
4
+ "version": "5.0.26",
5
5
  "homepage": "https://feathersjs.com",
6
6
  "main": "lib/",
7
7
  "keywords": [
@@ -51,23 +51,23 @@
51
51
  "access": "public"
52
52
  },
53
53
  "dependencies": {
54
- "@feathersjs/adapter-commons": "^5.0.24",
55
- "@feathersjs/commons": "^5.0.24",
56
- "@feathersjs/errors": "^5.0.24",
57
- "@feathersjs/feathers": "^5.0.24"
54
+ "@feathersjs/adapter-commons": "^5.0.26",
55
+ "@feathersjs/commons": "^5.0.26",
56
+ "@feathersjs/errors": "^5.0.26",
57
+ "@feathersjs/feathers": "^5.0.26"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "mongodb": "^6.5.0"
61
61
  },
62
62
  "devDependencies": {
63
- "@feathersjs/adapter-tests": "^5.0.24",
64
- "@feathersjs/schema": "^5.0.24",
63
+ "@feathersjs/adapter-tests": "^5.0.26",
64
+ "@feathersjs/schema": "^5.0.26",
65
65
  "@types/mocha": "^10.0.6",
66
- "@types/node": "^20.11.26",
67
- "mocha": "^10.3.0",
68
- "mongodb-memory-server": "^9.1.7",
66
+ "@types/node": "^20.12.8",
67
+ "mocha": "^10.4.0",
68
+ "mongodb-memory-server": "^9.2.0",
69
69
  "shx": "^0.3.4",
70
- "typescript": "^5.4.2"
70
+ "typescript": "^5.4.5"
71
71
  },
72
- "gitHead": "09519fb1c454ea718747a09797bc6dfd3b6a79a3"
72
+ "gitHead": "3fe6843c1a478a2887ca91b6f79eda3b61d35ef3"
73
73
  }
package/src/adapter.ts CHANGED
@@ -7,13 +7,15 @@ import {
7
7
  DeleteOptions,
8
8
  CountDocumentsOptions,
9
9
  ReplaceOptions,
10
- Document
10
+ FindOneAndReplaceOptions,
11
+ FindOneAndUpdateOptions,
12
+ Document,
13
+ FindOneAndDeleteOptions
11
14
  } from 'mongodb'
12
15
  import { BadRequest, MethodNotAllowed, NotFound } from '@feathersjs/errors'
13
16
  import { _ } from '@feathersjs/commons'
14
17
  import {
15
18
  AdapterBase,
16
- select,
17
19
  AdapterParams,
18
20
  AdapterServiceOptions,
19
21
  PaginationOptions,
@@ -39,6 +41,8 @@ export interface MongoDBAdapterParams<Q = AdapterQuery>
39
41
  | DeleteOptions
40
42
  | CountDocumentsOptions
41
43
  | ReplaceOptions
44
+ | FindOneAndReplaceOptions
45
+ | FindOneAndDeleteOptions
42
46
  }
43
47
 
44
48
  export type AdapterId = Id | ObjectId
@@ -103,16 +107,16 @@ export class MongoDbAdapter<
103
107
  async findRaw(params: ServiceParams) {
104
108
  const { filters, query } = this.filterQuery(null, params)
105
109
  const model = await this.getModel(params)
106
- const q = model.find(query, { ...params.mongodb })
107
-
108
- if (filters.$select !== undefined) {
109
- q.project(this.getSelect(filters.$select))
110
- }
110
+ const q = model.find(query, params.mongodb)
111
111
 
112
112
  if (filters.$sort !== undefined) {
113
113
  q.sort(filters.$sort)
114
114
  }
115
115
 
116
+ if (filters.$select !== undefined) {
117
+ q.project(this.getProjection(filters.$select))
118
+ }
119
+
116
120
  if (filters.$skip !== undefined) {
117
121
  q.skip(filters.$skip)
118
122
  }
@@ -124,6 +128,7 @@ export class MongoDbAdapter<
124
128
  return q
125
129
  }
126
130
 
131
+ /* TODO: Remove $out and $merge stages, else it returns an empty cursor. I think its safe to assume this is primarily for querying. */
127
132
  async aggregateRaw(params: ServiceParams) {
128
133
  const model = await this.getModel(params)
129
134
  const pipeline = params.pipeline || []
@@ -132,21 +137,21 @@ export class MongoDbAdapter<
132
137
  const feathersPipeline = this.makeFeathersPipeline(params)
133
138
  const after = index >= 0 ? pipeline.slice(index + 1) : pipeline
134
139
 
135
- return model.aggregate([...before, ...feathersPipeline, ...after])
140
+ return model.aggregate([...before, ...feathersPipeline, ...after], params.mongodb)
136
141
  }
137
142
 
138
143
  makeFeathersPipeline(params: ServiceParams) {
139
144
  const { filters, query } = this.filterQuery(null, params)
140
145
  const pipeline: Document[] = [{ $match: query }]
141
146
 
142
- if (filters.$select !== undefined) {
143
- pipeline.push({ $project: this.getSelect(filters.$select) })
144
- }
145
-
146
147
  if (filters.$sort !== undefined) {
147
148
  pipeline.push({ $sort: filters.$sort })
148
149
  }
149
150
 
151
+ if (filters.$select !== undefined) {
152
+ pipeline.push({ $project: this.getProjection(filters.$select) })
153
+ }
154
+
150
155
  if (filters.$skip !== undefined) {
151
156
  pipeline.push({ $skip: filters.$skip })
152
157
  }
@@ -154,10 +159,14 @@ export class MongoDbAdapter<
154
159
  if (filters.$limit !== undefined) {
155
160
  pipeline.push({ $limit: filters.$limit })
156
161
  }
162
+
157
163
  return pipeline
158
164
  }
159
165
 
160
- getSelect(select: string[] | { [key: string]: number }) {
166
+ getProjection(select?: string[] | { [key: string]: number }) {
167
+ if (!select) {
168
+ return undefined
169
+ }
161
170
  if (Array.isArray(select)) {
162
171
  if (!select.includes(this.id)) {
163
172
  select = [this.id, ...select]
@@ -181,10 +190,6 @@ export class MongoDbAdapter<
181
190
  return select
182
191
  }
183
192
 
184
- async _findOrGet(id: NullableAdapterId, params: ServiceParams) {
185
- return id === null ? await this._find(params) : await this._get(id, params)
186
- }
187
-
188
193
  normalizeId<D>(id: NullableAdapterId, data: D): D {
189
194
  if (this.id === '_id') {
190
195
  // Default Mongo IDs cannot be updated. The Mongo library handles
@@ -201,32 +206,77 @@ export class MongoDbAdapter<
201
206
  return data
202
207
  }
203
208
 
209
+ async countDocuments(params: ServiceParams) {
210
+ const { useEstimatedDocumentCount } = this.getOptions(params)
211
+ const { query } = this.filterQuery(null, params)
212
+
213
+ if (params.pipeline) {
214
+ const aggregateParams = {
215
+ ...params,
216
+ query: {
217
+ ...params.query,
218
+ $select: [this.id],
219
+ $sort: undefined,
220
+ $skip: undefined,
221
+ $limit: undefined
222
+ }
223
+ }
224
+ const result = await this.aggregateRaw(aggregateParams).then((result) => result.toArray())
225
+ return result.length
226
+ }
227
+
228
+ const model = await this.getModel(params)
229
+
230
+ if (useEstimatedDocumentCount && typeof model.estimatedDocumentCount === 'function') {
231
+ return model.estimatedDocumentCount()
232
+ }
233
+
234
+ return model.countDocuments(query, params.mongodb)
235
+ }
236
+
204
237
  async _get(id: AdapterId, params: ServiceParams = {} as ServiceParams): Promise<Result> {
205
238
  const {
206
239
  query,
207
240
  filters: { $select }
208
241
  } = this.filterQuery(id, params)
209
- const projection = $select
210
- ? {
211
- projection: {
212
- ...this.getSelect($select),
213
- [this.id]: 1
214
- }
242
+
243
+ if (params.pipeline) {
244
+ const aggregateParams = {
245
+ ...params,
246
+ query: {
247
+ ...params.query,
248
+ $limit: 1,
249
+ $and: (params.query.$and || []).concat({
250
+ [this.id]: this.getObjectId(id)
251
+ })
215
252
  }
216
- : {}
253
+ }
254
+
255
+ return this.aggregateRaw(aggregateParams)
256
+ .then((result) => result.toArray())
257
+ .then(([result]) => {
258
+ if (!result) {
259
+ throw new NotFound(`No record found for id '${id}'`)
260
+ }
261
+
262
+ return result
263
+ })
264
+ .catch(errorHandler)
265
+ }
266
+
217
267
  const findOptions: FindOptions = {
218
- ...params.mongodb,
219
- ...projection
268
+ projection: this.getProjection($select),
269
+ ...params.mongodb
220
270
  }
221
271
 
222
272
  return this.getModel(params)
223
273
  .then((model) => model.findOne(query, findOptions))
224
- .then((data) => {
225
- if (data == null) {
274
+ .then((result) => {
275
+ if (!result) {
226
276
  throw new NotFound(`No record found for id '${id}'`)
227
277
  }
228
278
 
229
- return data
279
+ return result
230
280
  })
231
281
  .catch(errorHandler)
232
282
  }
@@ -235,34 +285,40 @@ export class MongoDbAdapter<
235
285
  async _find(params?: ServiceParams & { paginate: false }): Promise<Result[]>
236
286
  async _find(params?: ServiceParams): Promise<Paginated<Result> | Result[]>
237
287
  async _find(params: ServiceParams = {} as ServiceParams): Promise<Paginated<Result> | Result[]> {
238
- const { paginate, useEstimatedDocumentCount } = this.getOptions(params)
239
- const { filters, query } = this.filterQuery(null, params)
240
- const useAggregation = !params.mongodb && filters.$limit !== 0
241
- const countDocuments = async () => {
242
- if (paginate && paginate.default) {
243
- const model = await this.getModel(params)
244
- if (useEstimatedDocumentCount && typeof model.estimatedDocumentCount === 'function') {
245
- return model.estimatedDocumentCount()
246
- } else {
247
- return model.countDocuments(query, { ...params.mongodb })
248
- }
288
+ const { paginate } = this.getOptions(params)
289
+ const { filters } = this.filterQuery(null, params)
290
+ const paginationDisabled = params.paginate === false || !paginate || !paginate.default
291
+
292
+ const getData = () => {
293
+ const result = params.pipeline ? this.aggregateRaw(params) : this.findRaw(params)
294
+ return result.then((result) => result.toArray())
295
+ }
296
+
297
+ if (paginationDisabled) {
298
+ if (filters.$limit === 0) {
299
+ return [] as Result[]
300
+ }
301
+ const data = await getData()
302
+ return data as Result[]
303
+ }
304
+
305
+ if (filters.$limit === 0) {
306
+ return {
307
+ total: await this.countDocuments(params),
308
+ data: [] as Result[],
309
+ limit: filters.$limit,
310
+ skip: filters.$skip || 0
249
311
  }
250
- return Promise.resolve(0)
251
312
  }
252
313
 
253
- const [request, total] = await Promise.all([
254
- useAggregation ? this.aggregateRaw(params) : this.findRaw(params),
255
- countDocuments()
256
- ])
314
+ const [data, total] = await Promise.all([getData(), this.countDocuments(params)])
257
315
 
258
- const page = {
316
+ return {
259
317
  total,
318
+ data: data as Result[],
260
319
  limit: filters.$limit,
261
- skip: filters.$skip || 0,
262
- data: filters.$limit === 0 ? [] : ((await request.toArray()) as any as Result[])
320
+ skip: filters.$skip || 0
263
321
  }
264
-
265
- return paginate && paginate.default ? page : page.data
266
322
  }
267
323
 
268
324
  async _create(data: Data, params?: ServiceParams): Promise<Result>
@@ -272,12 +328,14 @@ export class MongoDbAdapter<
272
328
  data: Data | Data[],
273
329
  params: ServiceParams = {} as ServiceParams
274
330
  ): Promise<Result | Result[]> {
275
- const writeOptions = params.mongodb
331
+ if (Array.isArray(data) && !this.allowsMulti('create', params)) {
332
+ throw new MethodNotAllowed('Can not create multiple entries')
333
+ }
334
+
276
335
  const model = await this.getModel(params)
277
336
  const setId = (item: any) => {
278
337
  const entry = Object.assign({}, item)
279
338
 
280
- // Generate a MongoId if we use a custom id
281
339
  if (this.id !== '_id' && typeof entry[this.id] === 'undefined') {
282
340
  return {
283
341
  [this.id]: new ObjectId().toHexString(),
@@ -288,17 +346,29 @@ export class MongoDbAdapter<
288
346
  return entry
289
347
  }
290
348
 
291
- const promise = Array.isArray(data)
292
- ? model
293
- .insertMany(data.map(setId), writeOptions)
294
- .then(async (result) =>
295
- model.find({ _id: { $in: Object.values(result.insertedIds) } }, params.mongodb).toArray()
296
- )
297
- : model
298
- .insertOne(setId(data), writeOptions)
299
- .then(async (result) => model.findOne({ _id: result.insertedId }, params.mongodb))
349
+ if (Array.isArray(data)) {
350
+ const created = await model.insertMany(data.map(setId), params.mongodb).catch(errorHandler)
351
+ return this._find({
352
+ ...params,
353
+ paginate: false,
354
+ query: {
355
+ _id: { $in: Object.values(created.insertedIds) },
356
+ $select: params.query?.$select
357
+ }
358
+ })
359
+ }
300
360
 
301
- return promise.then(select(params, this.id)).catch(errorHandler)
361
+ const created = await model.insertOne(setId(data), params.mongodb).catch(errorHandler)
362
+ const result = await this._find({
363
+ ...params,
364
+ paginate: false,
365
+ query: {
366
+ _id: created.insertedId,
367
+ $select: params.query?.$select,
368
+ $limit: 1
369
+ }
370
+ })
371
+ return result[0]
302
372
  }
303
373
 
304
374
  async _patch(id: null, data: PatchData | Partial<Result>, params?: ServiceParams): Promise<Result[]>
@@ -321,45 +391,91 @@ export class MongoDbAdapter<
321
391
  const model = await this.getModel(params)
322
392
  const {
323
393
  query,
324
- filters: { $select }
394
+ filters: { $sort, $select }
325
395
  } = this.filterQuery(id, params)
326
- const updateOptions = { ...params.mongodb }
327
- const modifier = Object.keys(data).reduce((current, key) => {
328
- const value = (data as any)[key]
329
-
330
- if (key.charAt(0) !== '$') {
331
- current.$set = {
332
- ...current.$set,
333
- [key]: value
396
+
397
+ const replacement = Object.keys(data).reduce(
398
+ (current, key) => {
399
+ const value = (data as any)[key]
400
+
401
+ if (key.charAt(0) !== '$') {
402
+ current.$set[key] = value
403
+ } else if (key === '$set') {
404
+ current.$set = {
405
+ ...current.$set,
406
+ ...value
407
+ }
408
+ } else {
409
+ current[key] = value
334
410
  }
335
- } else {
336
- current[key] = value
337
- }
338
411
 
339
- return current
340
- }, {} as any)
341
- const originalIds = await this._findOrGet(id, {
342
- ...params,
343
- query: {
344
- ...query,
345
- $select: [this.id]
412
+ return current
346
413
  },
347
- paginate: false
348
- })
349
- const items = Array.isArray(originalIds) ? originalIds : [originalIds]
350
- const idList = items.map((item: any) => item[this.id])
351
- const findParams = {
352
- ...params,
353
- paginate: false,
354
- query: {
355
- [this.id]: { $in: idList },
356
- $select
414
+ { $set: {} } as any
415
+ )
416
+
417
+ if (id === null) {
418
+ const findParams = {
419
+ ...params,
420
+ paginate: false,
421
+ query: {
422
+ ...params.query,
423
+ $select: [this.id]
424
+ }
357
425
  }
426
+
427
+ return this._find(findParams)
428
+ .then(async (result) => {
429
+ const idList = (result as Result[]).map((item: any) => item[this.id])
430
+ await model.updateMany({ [this.id]: { $in: idList } }, replacement, params.mongodb)
431
+ return this._find({
432
+ ...params,
433
+ paginate: false,
434
+ query: {
435
+ [this.id]: { $in: idList },
436
+ $sort,
437
+ $select
438
+ }
439
+ })
440
+ })
441
+ .catch(errorHandler)
358
442
  }
359
443
 
360
- await model.updateMany(query, modifier, updateOptions)
444
+ if (params.pipeline) {
445
+ const getParams = {
446
+ ...params,
447
+ query: {
448
+ ...params.query,
449
+ $select: [this.id]
450
+ }
451
+ }
452
+
453
+ return this._get(id, getParams)
454
+ .then(async () => {
455
+ await model.updateOne({ [this.id]: id }, replacement, params.mongodb)
456
+ return this._get(id, {
457
+ ...params,
458
+ query: { $select }
459
+ })
460
+ })
461
+ .catch(errorHandler)
462
+ }
463
+
464
+ const updateOptions: FindOneAndUpdateOptions = {
465
+ projection: this.getProjection($select),
466
+ ...(params.mongodb as FindOneAndUpdateOptions),
467
+ returnDocument: 'after'
468
+ }
361
469
 
362
- return this._findOrGet(id, findParams).catch(errorHandler)
470
+ return model
471
+ .findOneAndUpdate(query, replacement, updateOptions)
472
+ .then((result) => {
473
+ if (!result) {
474
+ throw new NotFound(`No record found for id '${id}'`)
475
+ }
476
+ return result as Result
477
+ })
478
+ .catch(errorHandler)
363
479
  }
364
480
 
365
481
  async _update(id: AdapterId, data: Data, params: ServiceParams = {} as ServiceParams): Promise<Result> {
@@ -367,13 +483,48 @@ export class MongoDbAdapter<
367
483
  throw new BadRequest("You can not replace multiple instances. Did you mean 'patch'?")
368
484
  }
369
485
 
486
+ const {
487
+ query,
488
+ filters: { $select }
489
+ } = this.filterQuery(id, params)
370
490
  const model = await this.getModel(params)
371
- const { query } = this.filterQuery(id, params)
372
- const replaceOptions = { ...params.mongodb }
491
+ const replacement = this.normalizeId(id, data)
492
+
493
+ if (params.pipeline) {
494
+ const getParams = {
495
+ ...params,
496
+ query: {
497
+ ...params.query,
498
+ $select: [this.id]
499
+ }
500
+ }
373
501
 
374
- await model.replaceOne(query, this.normalizeId(id, data), replaceOptions)
502
+ return this._get(id, getParams)
503
+ .then(async () => {
504
+ await model.replaceOne({ [this.id]: id }, replacement, params.mongodb)
505
+ return this._get(id, {
506
+ ...params,
507
+ query: { $select }
508
+ })
509
+ })
510
+ .catch(errorHandler)
511
+ }
512
+
513
+ const replaceOptions: FindOneAndReplaceOptions = {
514
+ projection: this.getProjection($select),
515
+ ...(params.mongodb as FindOneAndReplaceOptions),
516
+ returnDocument: 'after'
517
+ }
375
518
 
376
- return this._findOrGet(id, params).catch(errorHandler)
519
+ return model
520
+ .findOneAndReplace(query, replacement, replaceOptions)
521
+ .then((result) => {
522
+ if (!result) {
523
+ throw new NotFound(`No record found for id '${id}'`)
524
+ }
525
+ return result as Result
526
+ })
527
+ .catch(errorHandler)
377
528
  }
378
529
 
379
530
  async _remove(id: null, params?: ServiceParams): Promise<Result[]>
@@ -388,24 +539,43 @@ export class MongoDbAdapter<
388
539
  }
389
540
 
390
541
  const model = await this.getModel(params)
391
- const {
392
- query,
393
- filters: { $select }
394
- } = this.filterQuery(id, params)
395
- const deleteOptions = { ...params.mongodb }
542
+ const { query } = this.filterQuery(id, params)
396
543
  const findParams = {
397
544
  ...params,
398
- paginate: false,
399
- query: {
400
- ...query,
401
- $select
402
- }
545
+ paginate: false
546
+ }
547
+
548
+ if (id === null) {
549
+ return this._find(findParams)
550
+ .then(async (result) => {
551
+ const idList = (result as Result[]).map((item: any) => item[this.id])
552
+ await model.deleteMany({ [this.id]: { $in: idList } }, params.mongodb)
553
+ return result
554
+ })
555
+ .catch(errorHandler)
556
+ }
557
+
558
+ if (params.pipeline) {
559
+ return this._get(id, params)
560
+ .then(async (result) => {
561
+ await model.deleteOne({ [this.id]: id }, params.mongodb)
562
+ return result
563
+ })
564
+ .catch(errorHandler)
403
565
  }
404
566
 
405
- return this._findOrGet(id, findParams)
406
- .then(async (items) => {
407
- await model.deleteMany(query, deleteOptions)
408
- return items
567
+ const deleteOptions: FindOneAndDeleteOptions = {
568
+ ...(params.mongodb as FindOneAndDeleteOptions),
569
+ projection: this.getProjection(params.query?.$select)
570
+ }
571
+
572
+ return model
573
+ .findOneAndDelete(query, deleteOptions)
574
+ .then((result) => {
575
+ if (!result) {
576
+ throw new NotFound(`No record found for id '${id}'`)
577
+ }
578
+ return result as Result
409
579
  })
410
580
  .catch(errorHandler)
411
581
  }
package/src/index.ts CHANGED
@@ -41,6 +41,7 @@ export class MongoDBService<
41
41
  return this._create(data, params)
42
42
  }
43
43
 
44
+ async update(id: NullableAdapterId, data: Data, params?: ServiceParams): Promise<Result>
44
45
  async update(id: AdapterId, data: Data, params?: ServiceParams): Promise<Result> {
45
46
  return this._update(id, data, {
46
47
  ...params,