@feathersjs/mongodb 5.0.0-pre.31 → 5.0.0-pre.33
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 +10 -0
- package/lib/adapter.d.ts +13 -6
- package/lib/adapter.js +75 -36
- package/lib/adapter.js.map +1 -1
- package/lib/index.d.ts +6 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/resolvers.d.ts +10 -0
- package/lib/resolvers.js +27 -0
- package/lib/resolvers.js.map +1 -0
- package/package.json +10 -10
- package/src/adapter.ts +99 -47
- package/src/index.ts +16 -8
- package/src/resolvers.ts +41 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,16 @@
|
|
|
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.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
- **mongodb:** Add ObjectId resolvers and MongoDB option in the guide ([#2847](https://github.com/feathersjs/feathers/issues/2847)) ([c5c1fba](https://github.com/feathersjs/feathers/commit/c5c1fba5718a63412075cd3838b86b889eb0bd48))
|
|
11
|
+
|
|
12
|
+
# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26)
|
|
13
|
+
|
|
14
|
+
**Note:** Version bump only for package @feathersjs/mongodb
|
|
15
|
+
|
|
6
16
|
# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12)
|
|
7
17
|
|
|
8
18
|
### Features
|
package/lib/adapter.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ObjectId, Collection, FindOptions, BulkWriteOptions, InsertOneOptions, DeleteOptions, CountDocumentsOptions, ReplaceOptions } from 'mongodb';
|
|
1
|
+
import { ObjectId, Collection, FindOptions, BulkWriteOptions, InsertOneOptions, DeleteOptions, CountDocumentsOptions, ReplaceOptions, Document } from 'mongodb';
|
|
2
2
|
import { AdapterBase, AdapterParams, AdapterServiceOptions, PaginationOptions, AdapterQuery } from '@feathersjs/adapter-commons';
|
|
3
3
|
import { NullableId, Id, Paginated } from '@feathersjs/feathers';
|
|
4
4
|
export interface MongoDBAdapterOptions extends AdapterServiceOptions {
|
|
@@ -7,12 +7,13 @@ export interface MongoDBAdapterOptions extends AdapterServiceOptions {
|
|
|
7
7
|
useEstimatedDocumentCount?: boolean;
|
|
8
8
|
}
|
|
9
9
|
export interface MongoDBAdapterParams<Q = AdapterQuery> extends AdapterParams<Q, Partial<MongoDBAdapterOptions>> {
|
|
10
|
+
pipeline?: Document[];
|
|
10
11
|
mongodb?: BulkWriteOptions | FindOptions | InsertOneOptions | DeleteOptions | CountDocumentsOptions | ReplaceOptions;
|
|
11
12
|
}
|
|
12
13
|
export declare class MongoDbAdapter<T, D = Partial<T>, P extends MongoDBAdapterParams<any> = MongoDBAdapterParams> extends AdapterBase<T, D, P, MongoDBAdapterOptions> {
|
|
13
14
|
constructor(options: MongoDBAdapterOptions);
|
|
14
15
|
getObjectId(id: Id | ObjectId): Id | ObjectId;
|
|
15
|
-
filterQuery(id: NullableId, params: P): {
|
|
16
|
+
filterQuery(id: NullableId | ObjectId, params: P): {
|
|
16
17
|
filters: {
|
|
17
18
|
$select: string[];
|
|
18
19
|
$sort: {
|
|
@@ -25,14 +26,18 @@ export declare class MongoDbAdapter<T, D = Partial<T>, P extends MongoDBAdapterP
|
|
|
25
26
|
[key: string]: any;
|
|
26
27
|
};
|
|
27
28
|
};
|
|
29
|
+
getModel(params: P): Promise<Collection<Document>>;
|
|
30
|
+
findRaw(params: P): Promise<import("mongodb").FindCursor<import("mongodb").WithId<Document>>>;
|
|
31
|
+
aggregateRaw(params: P): Promise<import("mongodb").AggregationCursor<Document>>;
|
|
32
|
+
makeFeathersPipeline(params: P): Document[];
|
|
28
33
|
getSelect(select: string[] | {
|
|
29
34
|
[key: string]: number;
|
|
30
35
|
}): {
|
|
31
36
|
[key: string]: number;
|
|
32
37
|
};
|
|
33
|
-
$findOrGet(id: NullableId, params: P): Promise<T | Paginated<T> | T[]>;
|
|
34
|
-
normalizeId(id: NullableId, data: Partial<D>): Partial<D>;
|
|
35
|
-
$get(id: Id, params?: P): Promise<T>;
|
|
38
|
+
$findOrGet(id: NullableId | ObjectId, params: P): Promise<T | Paginated<T> | T[]>;
|
|
39
|
+
normalizeId(id: NullableId | ObjectId, data: Partial<D>): Partial<D>;
|
|
40
|
+
$get(id: Id | ObjectId, params?: P): Promise<T>;
|
|
36
41
|
$find(params?: P & {
|
|
37
42
|
paginate?: PaginationOptions;
|
|
38
43
|
}): Promise<Paginated<T>>;
|
|
@@ -45,9 +50,11 @@ export declare class MongoDbAdapter<T, D = Partial<T>, P extends MongoDBAdapterP
|
|
|
45
50
|
$create(data: D | D[], _params?: P): Promise<T | T[]>;
|
|
46
51
|
$patch(id: null, data: Partial<D>, params?: P): Promise<T[]>;
|
|
47
52
|
$patch(id: Id, data: Partial<D>, params?: P): Promise<T>;
|
|
53
|
+
$patch(id: ObjectId, data: Partial<D>, params?: P): Promise<T>;
|
|
48
54
|
$patch(id: NullableId, data: Partial<D>, _params?: P): Promise<T | T[]>;
|
|
49
|
-
$update(id: Id, data: D, params?: P): Promise<T>;
|
|
55
|
+
$update(id: Id | ObjectId, data: D, params?: P): Promise<T>;
|
|
50
56
|
$remove(id: null, params?: P): Promise<T[]>;
|
|
51
57
|
$remove(id: Id, params?: P): Promise<T>;
|
|
58
|
+
$remove(id: ObjectId, params?: P): Promise<T>;
|
|
52
59
|
$remove(id: NullableId, _params?: P): Promise<T | T[]>;
|
|
53
60
|
}
|
package/lib/adapter.js
CHANGED
|
@@ -41,6 +41,54 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
|
|
|
41
41
|
query
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
|
+
getModel(params) {
|
|
45
|
+
const { Model } = this.getOptions(params);
|
|
46
|
+
return Promise.resolve(Model);
|
|
47
|
+
}
|
|
48
|
+
async findRaw(params) {
|
|
49
|
+
const { filters, query } = this.filterQuery(null, params);
|
|
50
|
+
const model = await this.getModel(params);
|
|
51
|
+
const q = model.find(query, { ...params.mongodb });
|
|
52
|
+
if (filters.$select !== undefined) {
|
|
53
|
+
q.project(this.getSelect(filters.$select));
|
|
54
|
+
}
|
|
55
|
+
if (filters.$sort !== undefined) {
|
|
56
|
+
q.sort(filters.$sort);
|
|
57
|
+
}
|
|
58
|
+
if (filters.$skip !== undefined) {
|
|
59
|
+
q.skip(filters.$skip);
|
|
60
|
+
}
|
|
61
|
+
if (filters.$limit !== undefined) {
|
|
62
|
+
q.limit(filters.$limit);
|
|
63
|
+
}
|
|
64
|
+
return q;
|
|
65
|
+
}
|
|
66
|
+
async aggregateRaw(params) {
|
|
67
|
+
const model = await this.getModel(params);
|
|
68
|
+
const pipeline = params.pipeline || [];
|
|
69
|
+
const index = pipeline.findIndex((stage) => stage.$feathers);
|
|
70
|
+
const before = index >= 0 ? pipeline.slice(0, index) : [];
|
|
71
|
+
const feathersPipeline = this.makeFeathersPipeline(params);
|
|
72
|
+
const after = index >= 0 ? pipeline.slice(index + 1) : pipeline;
|
|
73
|
+
return model.aggregate([...before, ...feathersPipeline, ...after]);
|
|
74
|
+
}
|
|
75
|
+
makeFeathersPipeline(params) {
|
|
76
|
+
const { filters, query } = this.filterQuery(null, params);
|
|
77
|
+
const pipeline = [{ $match: query }];
|
|
78
|
+
if (filters.$select !== undefined) {
|
|
79
|
+
pipeline.push({ $project: this.getSelect(filters.$select) });
|
|
80
|
+
}
|
|
81
|
+
if (filters.$sort !== undefined) {
|
|
82
|
+
pipeline.push({ $sort: filters.$sort });
|
|
83
|
+
}
|
|
84
|
+
if (filters.$skip !== undefined) {
|
|
85
|
+
pipeline.push({ $skip: filters.$skip });
|
|
86
|
+
}
|
|
87
|
+
if (filters.$limit !== undefined) {
|
|
88
|
+
pipeline.push({ $limit: filters.$limit });
|
|
89
|
+
}
|
|
90
|
+
return pipeline;
|
|
91
|
+
}
|
|
44
92
|
getSelect(select) {
|
|
45
93
|
if (Array.isArray(select)) {
|
|
46
94
|
return select.reduce((value, name) => ({
|
|
@@ -70,7 +118,6 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
|
|
|
70
118
|
return data;
|
|
71
119
|
}
|
|
72
120
|
async $get(id, params = {}) {
|
|
73
|
-
const { Model } = this.getOptions(params);
|
|
74
121
|
const { query, filters: { $select } } = this.filterQuery(id, params);
|
|
75
122
|
const projection = $select
|
|
76
123
|
? {
|
|
@@ -84,7 +131,7 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
|
|
|
84
131
|
...params.mongodb,
|
|
85
132
|
...projection
|
|
86
133
|
};
|
|
87
|
-
return
|
|
134
|
+
return this.getModel(params)
|
|
88
135
|
.then((model) => model.findOne(query, findOptions))
|
|
89
136
|
.then((data) => {
|
|
90
137
|
if (data == null) {
|
|
@@ -95,41 +142,36 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
|
|
|
95
142
|
.catch(error_handler_1.errorHandler);
|
|
96
143
|
}
|
|
97
144
|
async $find(params = {}) {
|
|
145
|
+
const { paginate, useEstimatedDocumentCount } = this.getOptions(params);
|
|
98
146
|
const { filters, query } = this.filterQuery(null, params);
|
|
99
|
-
const
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
147
|
+
const useAggregation = !params.mongodb && filters.$limit !== 0;
|
|
148
|
+
const countDocuments = async () => {
|
|
149
|
+
if (paginate && paginate.default) {
|
|
150
|
+
const model = await this.getModel(params);
|
|
151
|
+
if (useEstimatedDocumentCount && typeof model.estimatedDocumentCount === 'function') {
|
|
152
|
+
return model.estimatedDocumentCount();
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
return model.countDocuments(query, { ...params.mongodb });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return Promise.resolve(0);
|
|
159
|
+
};
|
|
160
|
+
const [request, total] = await Promise.all([
|
|
161
|
+
useAggregation ? this.aggregateRaw(params) : this.findRaw(params),
|
|
162
|
+
countDocuments()
|
|
163
|
+
]);
|
|
164
|
+
const page = {
|
|
116
165
|
total,
|
|
117
166
|
limit: filters.$limit,
|
|
118
167
|
skip: filters.$skip || 0,
|
|
119
|
-
data: filters.$limit === 0 ? [] : (await
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (useEstimatedDocumentCount && typeof model.estimatedDocumentCount === 'function') {
|
|
123
|
-
return model.estimatedDocumentCount().then(runQuery);
|
|
124
|
-
}
|
|
125
|
-
return model.countDocuments(query, findOptions).then(runQuery);
|
|
126
|
-
}
|
|
127
|
-
return runQuery(0).then((page) => page.data);
|
|
168
|
+
data: filters.$limit === 0 ? [] : (await request.toArray())
|
|
169
|
+
};
|
|
170
|
+
return paginate && paginate.default ? page : page.data;
|
|
128
171
|
}
|
|
129
172
|
async $create(data, params = {}) {
|
|
130
173
|
const writeOptions = params.mongodb;
|
|
131
|
-
const
|
|
132
|
-
const model = await Promise.resolve(Model);
|
|
174
|
+
const model = await this.getModel(params);
|
|
133
175
|
const setId = (item) => {
|
|
134
176
|
const entry = Object.assign({}, item);
|
|
135
177
|
// Generate a MongoId if we use a custom id
|
|
@@ -152,8 +194,7 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
|
|
|
152
194
|
}
|
|
153
195
|
async $patch(id, _data, params = {}) {
|
|
154
196
|
const data = this.normalizeId(id, _data);
|
|
155
|
-
const
|
|
156
|
-
const model = await Promise.resolve(Model);
|
|
197
|
+
const model = await this.getModel(params);
|
|
157
198
|
const { query, filters: { $select } } = this.filterQuery(id, params);
|
|
158
199
|
const updateOptions = { ...params.mongodb };
|
|
159
200
|
const modifier = Object.keys(data).reduce((current, key) => {
|
|
@@ -191,16 +232,14 @@ class MongoDbAdapter extends adapter_commons_1.AdapterBase {
|
|
|
191
232
|
return this.$findOrGet(id, findParams).catch(error_handler_1.errorHandler);
|
|
192
233
|
}
|
|
193
234
|
async $update(id, data, params = {}) {
|
|
194
|
-
const
|
|
195
|
-
const model = await Promise.resolve(Model);
|
|
235
|
+
const model = await this.getModel(params);
|
|
196
236
|
const { query } = this.filterQuery(id, params);
|
|
197
237
|
const replaceOptions = { ...params.mongodb };
|
|
198
238
|
await model.replaceOne(query, this.normalizeId(id, data), replaceOptions);
|
|
199
239
|
return this.$findOrGet(id, params).catch(error_handler_1.errorHandler);
|
|
200
240
|
}
|
|
201
241
|
async $remove(id, params = {}) {
|
|
202
|
-
const
|
|
203
|
-
const model = await Promise.resolve(Model);
|
|
242
|
+
const model = await this.getModel(params);
|
|
204
243
|
const { query, filters: { $select } } = this.filterQuery(id, params);
|
|
205
244
|
const deleteOptions = { ...params.mongodb };
|
|
206
245
|
const findParams = {
|
package/lib/adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { PaginationOptions } from '@feathersjs/adapter-commons';
|
|
2
2
|
import { Paginated, ServiceMethods, Id, Params } from '@feathersjs/feathers';
|
|
3
|
+
import { ObjectId } from 'mongodb';
|
|
3
4
|
import { MongoDbAdapter, MongoDBAdapterParams } from './adapter';
|
|
4
5
|
export * from './adapter';
|
|
5
6
|
export * from './error-handler';
|
|
7
|
+
export * from './resolvers';
|
|
6
8
|
export declare class MongoDBService<T = any, D = Partial<T>, P extends Params<any> = MongoDBAdapterParams> extends MongoDbAdapter<T, D, P> implements ServiceMethods<T | Paginated<T>, D, P> {
|
|
7
9
|
find(params?: P & {
|
|
8
10
|
paginate?: PaginationOptions;
|
|
@@ -11,12 +13,16 @@ export declare class MongoDBService<T = any, D = Partial<T>, P extends Params<an
|
|
|
11
13
|
paginate: false;
|
|
12
14
|
}): Promise<T[]>;
|
|
13
15
|
find(params?: P): Promise<Paginated<T> | T[]>;
|
|
16
|
+
get(id: ObjectId, params?: P): Promise<T>;
|
|
14
17
|
get(id: Id, params?: P): Promise<T>;
|
|
15
18
|
create(data: D, params?: P): Promise<T>;
|
|
16
19
|
create(data: D[], params?: P): Promise<T[]>;
|
|
17
20
|
update(id: Id, data: D, params?: P): Promise<T>;
|
|
21
|
+
update(id: ObjectId, data: D, params?: P): Promise<T>;
|
|
22
|
+
patch(id: ObjectId, data: Partial<D>, params?: P): Promise<T>;
|
|
18
23
|
patch(id: Id, data: Partial<D>, params?: P): Promise<T>;
|
|
19
24
|
patch(id: null, data: Partial<D>, params?: P): Promise<T[]>;
|
|
20
25
|
remove(id: Id, params?: P): Promise<T>;
|
|
26
|
+
remove(id: ObjectId, params?: P): Promise<T>;
|
|
21
27
|
remove(id: null, params?: P): Promise<T[]>;
|
|
22
28
|
}
|
package/lib/index.js
CHANGED
|
@@ -18,6 +18,7 @@ exports.MongoDBService = void 0;
|
|
|
18
18
|
const adapter_1 = require("./adapter");
|
|
19
19
|
__exportStar(require("./adapter"), exports);
|
|
20
20
|
__exportStar(require("./error-handler"), exports);
|
|
21
|
+
__exportStar(require("./resolvers"), exports);
|
|
21
22
|
class MongoDBService extends adapter_1.MongoDbAdapter {
|
|
22
23
|
async find(params) {
|
|
23
24
|
return this._find(params);
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAGA,uCAAgE;AAEhE,4CAAyB;AACzB,kDAA+B;AAC/B,8CAA2B;AAE3B,MAAa,cACX,SAAQ,wBAAuB;IAM/B,KAAK,CAAC,IAAI,CAAC,MAAU;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAQ,CAAA;IAClC,CAAC;IAID,KAAK,CAAC,GAAG,CAAC,EAAiB,EAAE,MAAU;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAQ,EAAE,MAAM,CAAC,CAAA;IACpC,CAAC;IAID,KAAK,CAAC,MAAM,CAAC,IAAa,EAAE,MAAU;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC;IAID,KAAK,CAAC,MAAM,CAAC,EAAiB,EAAE,IAAO,EAAE,MAAU;QACjD,OAAO,IAAI,CAAC,OAAO,CAAC,EAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IAC7C,CAAC;IAKD,KAAK,CAAC,KAAK,CAAC,EAAyB,EAAE,IAAgB,EAAE,MAAU;QACjE,OAAO,IAAI,CAAC,MAAM,CAAC,EAAgB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACpD,CAAC;IAKD,KAAK,CAAC,MAAM,CAAC,EAAyB,EAAE,MAAU;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,EAAgB,EAAE,MAAM,CAAC,CAAA;IAC/C,CAAC;CACF;AA1CD,wCA0CC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ObjectId } from 'mongodb';
|
|
2
|
+
export declare type ObjectIdParam = string | number | ObjectId;
|
|
3
|
+
export declare type IdQueryObject<T> = {
|
|
4
|
+
$in?: T[];
|
|
5
|
+
$nin?: T[];
|
|
6
|
+
$ne?: T;
|
|
7
|
+
};
|
|
8
|
+
export declare function resolveObjectId(value: ObjectIdParam): Promise<ObjectId>;
|
|
9
|
+
export declare function resolveQueryObjectId(value: IdQueryObject<ObjectIdParam>): Promise<IdQueryObject<ObjectId>>;
|
|
10
|
+
export declare function resolveQueryObjectId(value: ObjectIdParam): Promise<ObjectId>;
|
package/lib/resolvers.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveQueryObjectId = exports.resolveObjectId = void 0;
|
|
4
|
+
const mongodb_1 = require("mongodb");
|
|
5
|
+
const toObjectId = (value) => new mongodb_1.ObjectId(value);
|
|
6
|
+
async function resolveObjectId(value) {
|
|
7
|
+
return toObjectId(value);
|
|
8
|
+
}
|
|
9
|
+
exports.resolveObjectId = resolveObjectId;
|
|
10
|
+
async function resolveQueryObjectId(value) {
|
|
11
|
+
if (typeof value === 'string' || typeof value === 'number' || value instanceof mongodb_1.ObjectId) {
|
|
12
|
+
return toObjectId(value);
|
|
13
|
+
}
|
|
14
|
+
const convertedObject = {};
|
|
15
|
+
if (Array.isArray(value.$in)) {
|
|
16
|
+
convertedObject.$in = value.$in.map(toObjectId);
|
|
17
|
+
}
|
|
18
|
+
if (Array.isArray(value.$nin)) {
|
|
19
|
+
convertedObject.$nin = value.$nin.map(toObjectId);
|
|
20
|
+
}
|
|
21
|
+
if (value.$ne !== undefined) {
|
|
22
|
+
convertedObject.$ne = toObjectId(value.$ne);
|
|
23
|
+
}
|
|
24
|
+
return convertedObject;
|
|
25
|
+
}
|
|
26
|
+
exports.resolveQueryObjectId = resolveQueryObjectId;
|
|
27
|
+
//# sourceMappingURL=resolvers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.js","sourceRoot":"","sources":["../src/resolvers.ts"],"names":[],"mappings":";;;AAAA,qCAAkC;AAUlC,MAAM,UAAU,GAAG,CAAC,KAAoB,EAAE,EAAE,CAAC,IAAI,kBAAQ,CAAC,KAAK,CAAC,CAAA;AAEzD,KAAK,UAAU,eAAe,CAAC,KAAoB;IACxD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC;AAFD,0CAEC;AAMM,KAAK,UAAU,oBAAoB,CAAC,KAAmD;IAC5F,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,YAAY,kBAAQ,EAAE;QACvF,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;KACzB;IAED,MAAM,eAAe,GAA4B,EAAE,CAAA;IAEnD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QAC5B,eAAe,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;KAChD;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;QAC7B,eAAe,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;KAClD;IAED,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;QAC3B,eAAe,CAAC,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;KAC5C;IAED,OAAO,eAAe,CAAA;AACxB,CAAC;AApBD,oDAoBC"}
|
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.0-pre.
|
|
4
|
+
"version": "5.0.0-pre.33",
|
|
5
5
|
"homepage": "https://feathersjs.com",
|
|
6
6
|
"main": "lib/",
|
|
7
7
|
"keywords": [
|
|
@@ -51,22 +51,22 @@
|
|
|
51
51
|
"access": "public"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"@feathersjs/adapter-commons": "^5.0.0-pre.
|
|
55
|
-
"@feathersjs/commons": "^5.0.0-pre.
|
|
56
|
-
"@feathersjs/errors": "^5.0.0-pre.
|
|
57
|
-
"@feathersjs/feathers": "^5.0.0-pre.
|
|
54
|
+
"@feathersjs/adapter-commons": "^5.0.0-pre.33",
|
|
55
|
+
"@feathersjs/commons": "^5.0.0-pre.33",
|
|
56
|
+
"@feathersjs/errors": "^5.0.0-pre.33",
|
|
57
|
+
"@feathersjs/feathers": "^5.0.0-pre.33"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"mongodb": "^4.5.0"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
|
-
"@feathersjs/adapter-tests": "^5.0.0-pre.
|
|
63
|
+
"@feathersjs/adapter-tests": "^5.0.0-pre.33",
|
|
64
64
|
"@types/mocha": "^10.0.0",
|
|
65
|
-
"@types/node": "^18.
|
|
66
|
-
"mocha": "^10.
|
|
67
|
-
"mongodb-memory-server": "^8.9.
|
|
65
|
+
"@types/node": "^18.11.9",
|
|
66
|
+
"mocha": "^10.1.0",
|
|
67
|
+
"mongodb-memory-server": "^8.9.5",
|
|
68
68
|
"shx": "^0.3.4",
|
|
69
69
|
"typescript": "^4.8.4"
|
|
70
70
|
},
|
|
71
|
-
"gitHead": "
|
|
71
|
+
"gitHead": "89f516bcb1457e23a02c6212e9cd8bacc4d267d4"
|
|
72
72
|
}
|
package/src/adapter.ts
CHANGED
|
@@ -6,7 +6,8 @@ import {
|
|
|
6
6
|
InsertOneOptions,
|
|
7
7
|
DeleteOptions,
|
|
8
8
|
CountDocumentsOptions,
|
|
9
|
-
ReplaceOptions
|
|
9
|
+
ReplaceOptions,
|
|
10
|
+
Document
|
|
10
11
|
} from 'mongodb'
|
|
11
12
|
import { NotFound } from '@feathersjs/errors'
|
|
12
13
|
import { _ } from '@feathersjs/commons'
|
|
@@ -29,6 +30,7 @@ export interface MongoDBAdapterOptions extends AdapterServiceOptions {
|
|
|
29
30
|
|
|
30
31
|
export interface MongoDBAdapterParams<Q = AdapterQuery>
|
|
31
32
|
extends AdapterParams<Q, Partial<MongoDBAdapterOptions>> {
|
|
33
|
+
pipeline?: Document[]
|
|
32
34
|
mongodb?:
|
|
33
35
|
| BulkWriteOptions
|
|
34
36
|
| FindOptions
|
|
@@ -67,7 +69,7 @@ export class MongoDbAdapter<
|
|
|
67
69
|
return id
|
|
68
70
|
}
|
|
69
71
|
|
|
70
|
-
filterQuery(id: NullableId, params: P) {
|
|
72
|
+
filterQuery(id: NullableId | ObjectId, params: P) {
|
|
71
73
|
const { $select, $sort, $limit, $skip, ...query } = (params.query || {}) as AdapterQuery
|
|
72
74
|
|
|
73
75
|
if (id !== null) {
|
|
@@ -86,6 +88,68 @@ export class MongoDbAdapter<
|
|
|
86
88
|
}
|
|
87
89
|
}
|
|
88
90
|
|
|
91
|
+
getModel(params: P) {
|
|
92
|
+
const { Model } = this.getOptions(params)
|
|
93
|
+
return Promise.resolve(Model)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async findRaw(params: P) {
|
|
97
|
+
const { filters, query } = this.filterQuery(null, params)
|
|
98
|
+
const model = await this.getModel(params)
|
|
99
|
+
const q = model.find(query, { ...params.mongodb })
|
|
100
|
+
|
|
101
|
+
if (filters.$select !== undefined) {
|
|
102
|
+
q.project(this.getSelect(filters.$select))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (filters.$sort !== undefined) {
|
|
106
|
+
q.sort(filters.$sort)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (filters.$skip !== undefined) {
|
|
110
|
+
q.skip(filters.$skip)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (filters.$limit !== undefined) {
|
|
114
|
+
q.limit(filters.$limit)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return q
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async aggregateRaw(params: P) {
|
|
121
|
+
const model = await this.getModel(params)
|
|
122
|
+
const pipeline = params.pipeline || []
|
|
123
|
+
const index = pipeline.findIndex((stage: Document) => stage.$feathers)
|
|
124
|
+
const before = index >= 0 ? pipeline.slice(0, index) : []
|
|
125
|
+
const feathersPipeline = this.makeFeathersPipeline(params)
|
|
126
|
+
const after = index >= 0 ? pipeline.slice(index + 1) : pipeline
|
|
127
|
+
|
|
128
|
+
return model.aggregate([...before, ...feathersPipeline, ...after])
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
makeFeathersPipeline(params: P) {
|
|
132
|
+
const { filters, query } = this.filterQuery(null, params)
|
|
133
|
+
const pipeline: Document[] = [{ $match: query }]
|
|
134
|
+
|
|
135
|
+
if (filters.$select !== undefined) {
|
|
136
|
+
pipeline.push({ $project: this.getSelect(filters.$select) })
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (filters.$sort !== undefined) {
|
|
140
|
+
pipeline.push({ $sort: filters.$sort })
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (filters.$skip !== undefined) {
|
|
144
|
+
pipeline.push({ $skip: filters.$skip })
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (filters.$limit !== undefined) {
|
|
148
|
+
pipeline.push({ $limit: filters.$limit })
|
|
149
|
+
}
|
|
150
|
+
return pipeline
|
|
151
|
+
}
|
|
152
|
+
|
|
89
153
|
getSelect(select: string[] | { [key: string]: number }) {
|
|
90
154
|
if (Array.isArray(select)) {
|
|
91
155
|
return select.reduce<{ [key: string]: number }>(
|
|
@@ -100,11 +164,11 @@ export class MongoDbAdapter<
|
|
|
100
164
|
return select
|
|
101
165
|
}
|
|
102
166
|
|
|
103
|
-
async $findOrGet(id: NullableId, params: P) {
|
|
167
|
+
async $findOrGet(id: NullableId | ObjectId, params: P) {
|
|
104
168
|
return id === null ? await this.$find(params) : await this.$get(id, params)
|
|
105
169
|
}
|
|
106
170
|
|
|
107
|
-
normalizeId(id: NullableId, data: Partial<D>): Partial<D> {
|
|
171
|
+
normalizeId(id: NullableId | ObjectId, data: Partial<D>): Partial<D> {
|
|
108
172
|
if (this.id === '_id') {
|
|
109
173
|
// Default Mongo IDs cannot be updated. The Mongo library handles
|
|
110
174
|
// this automatically.
|
|
@@ -120,8 +184,7 @@ export class MongoDbAdapter<
|
|
|
120
184
|
return data
|
|
121
185
|
}
|
|
122
186
|
|
|
123
|
-
async $get(id: Id, params: P = {} as P): Promise<T> {
|
|
124
|
-
const { Model } = this.getOptions(params)
|
|
187
|
+
async $get(id: Id | ObjectId, params: P = {} as P): Promise<T> {
|
|
125
188
|
const {
|
|
126
189
|
query,
|
|
127
190
|
filters: { $select }
|
|
@@ -139,7 +202,7 @@ export class MongoDbAdapter<
|
|
|
139
202
|
...projection
|
|
140
203
|
}
|
|
141
204
|
|
|
142
|
-
return
|
|
205
|
+
return this.getModel(params)
|
|
143
206
|
.then((model) => model.findOne(query, findOptions))
|
|
144
207
|
.then((data) => {
|
|
145
208
|
if (data == null) {
|
|
@@ -155,44 +218,35 @@ export class MongoDbAdapter<
|
|
|
155
218
|
async $find(params?: P & { paginate: false }): Promise<T[]>
|
|
156
219
|
async $find(params?: P): Promise<Paginated<T> | T[]>
|
|
157
220
|
async $find(params: P = {} as P): Promise<Paginated<T> | T[]> {
|
|
221
|
+
const { paginate, useEstimatedDocumentCount } = this.getOptions(params)
|
|
158
222
|
const { filters, query } = this.filterQuery(null, params)
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if (filters.$limit !== undefined) {
|
|
173
|
-
q.limit(filters.$limit)
|
|
223
|
+
const useAggregation = !params.mongodb && filters.$limit !== 0
|
|
224
|
+
|
|
225
|
+
const countDocuments = async () => {
|
|
226
|
+
if (paginate && paginate.default) {
|
|
227
|
+
const model = await this.getModel(params)
|
|
228
|
+
if (useEstimatedDocumentCount && typeof model.estimatedDocumentCount === 'function') {
|
|
229
|
+
return model.estimatedDocumentCount()
|
|
230
|
+
} else {
|
|
231
|
+
return model.countDocuments(query, { ...params.mongodb })
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return Promise.resolve(0)
|
|
174
235
|
}
|
|
175
236
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
237
|
+
const [request, total] = await Promise.all([
|
|
238
|
+
useAggregation ? this.aggregateRaw(params) : this.findRaw(params),
|
|
239
|
+
countDocuments()
|
|
240
|
+
])
|
|
179
241
|
|
|
180
|
-
const
|
|
242
|
+
const page = {
|
|
181
243
|
total,
|
|
182
244
|
limit: filters.$limit,
|
|
183
245
|
skip: filters.$skip || 0,
|
|
184
|
-
data: filters.$limit === 0 ? [] : ((await
|
|
185
|
-
})
|
|
186
|
-
|
|
187
|
-
if (paginate && paginate.default) {
|
|
188
|
-
if (useEstimatedDocumentCount && typeof model.estimatedDocumentCount === 'function') {
|
|
189
|
-
return model.estimatedDocumentCount().then(runQuery)
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
return model.countDocuments(query, findOptions).then(runQuery)
|
|
246
|
+
data: filters.$limit === 0 ? [] : ((await request.toArray()) as any as T[])
|
|
193
247
|
}
|
|
194
248
|
|
|
195
|
-
return
|
|
249
|
+
return paginate && paginate.default ? page : page.data
|
|
196
250
|
}
|
|
197
251
|
|
|
198
252
|
async $create(data: D, params?: P): Promise<T>
|
|
@@ -200,8 +254,7 @@ export class MongoDbAdapter<
|
|
|
200
254
|
async $create(data: D | D[], _params?: P): Promise<T | T[]>
|
|
201
255
|
async $create(data: D | D[], params: P = {} as P): Promise<T | T[]> {
|
|
202
256
|
const writeOptions = params.mongodb
|
|
203
|
-
const
|
|
204
|
-
const model = await Promise.resolve(Model)
|
|
257
|
+
const model = await this.getModel(params)
|
|
205
258
|
const setId = (item: any) => {
|
|
206
259
|
const entry = Object.assign({}, item)
|
|
207
260
|
|
|
@@ -233,11 +286,11 @@ export class MongoDbAdapter<
|
|
|
233
286
|
|
|
234
287
|
async $patch(id: null, data: Partial<D>, params?: P): Promise<T[]>
|
|
235
288
|
async $patch(id: Id, data: Partial<D>, params?: P): Promise<T>
|
|
289
|
+
async $patch(id: ObjectId, data: Partial<D>, params?: P): Promise<T>
|
|
236
290
|
async $patch(id: NullableId, data: Partial<D>, _params?: P): Promise<T | T[]>
|
|
237
|
-
async $patch(id: NullableId, _data: Partial<D>, params: P = {} as P): Promise<T | T[]> {
|
|
291
|
+
async $patch(id: NullableId | ObjectId, _data: Partial<D>, params: P = {} as P): Promise<T | T[]> {
|
|
238
292
|
const data = this.normalizeId(id, _data)
|
|
239
|
-
const
|
|
240
|
-
const model = await Promise.resolve(Model)
|
|
293
|
+
const model = await this.getModel(params)
|
|
241
294
|
const {
|
|
242
295
|
query,
|
|
243
296
|
filters: { $select }
|
|
@@ -281,9 +334,8 @@ export class MongoDbAdapter<
|
|
|
281
334
|
return this.$findOrGet(id, findParams).catch(errorHandler)
|
|
282
335
|
}
|
|
283
336
|
|
|
284
|
-
async $update(id: Id, data: D, params: P = {} as P): Promise<T> {
|
|
285
|
-
const
|
|
286
|
-
const model = await Promise.resolve(Model)
|
|
337
|
+
async $update(id: Id | ObjectId, data: D, params: P = {} as P): Promise<T> {
|
|
338
|
+
const model = await this.getModel(params)
|
|
287
339
|
const { query } = this.filterQuery(id, params)
|
|
288
340
|
const replaceOptions = { ...params.mongodb }
|
|
289
341
|
|
|
@@ -294,10 +346,10 @@ export class MongoDbAdapter<
|
|
|
294
346
|
|
|
295
347
|
async $remove(id: null, params?: P): Promise<T[]>
|
|
296
348
|
async $remove(id: Id, params?: P): Promise<T>
|
|
349
|
+
async $remove(id: ObjectId, params?: P): Promise<T>
|
|
297
350
|
async $remove(id: NullableId, _params?: P): Promise<T | T[]>
|
|
298
|
-
async $remove(id: NullableId, params: P = {} as P): Promise<T | T[]> {
|
|
299
|
-
const
|
|
300
|
-
const model = await Promise.resolve(Model)
|
|
351
|
+
async $remove(id: NullableId | ObjectId, params: P = {} as P): Promise<T | T[]> {
|
|
352
|
+
const model = await this.getModel(params)
|
|
301
353
|
const {
|
|
302
354
|
query,
|
|
303
355
|
filters: { $select }
|
package/src/index.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { PaginationOptions } from '@feathersjs/adapter-commons'
|
|
2
2
|
import { Paginated, ServiceMethods, Id, NullableId, Params } from '@feathersjs/feathers'
|
|
3
|
+
import { ObjectId } from 'mongodb'
|
|
3
4
|
import { MongoDbAdapter, MongoDBAdapterParams } from './adapter'
|
|
4
5
|
|
|
5
6
|
export * from './adapter'
|
|
6
7
|
export * from './error-handler'
|
|
8
|
+
export * from './resolvers'
|
|
7
9
|
|
|
8
10
|
export class MongoDBService<T = any, D = Partial<T>, P extends Params<any> = MongoDBAdapterParams>
|
|
9
11
|
extends MongoDbAdapter<T, D, P>
|
|
@@ -16,8 +18,10 @@ export class MongoDBService<T = any, D = Partial<T>, P extends Params<any> = Mon
|
|
|
16
18
|
return this._find(params) as any
|
|
17
19
|
}
|
|
18
20
|
|
|
19
|
-
async get(id:
|
|
20
|
-
|
|
21
|
+
async get(id: ObjectId, params?: P): Promise<T>
|
|
22
|
+
async get(id: Id, params?: P): Promise<T>
|
|
23
|
+
async get(id: Id | ObjectId, params?: P): Promise<T> {
|
|
24
|
+
return this._get(id as Id, params)
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
async create(data: D, params?: P): Promise<T>
|
|
@@ -26,19 +30,23 @@ export class MongoDBService<T = any, D = Partial<T>, P extends Params<any> = Mon
|
|
|
26
30
|
return this._create(data, params)
|
|
27
31
|
}
|
|
28
32
|
|
|
29
|
-
async update(id: Id, data: D, params?: P): Promise<T>
|
|
30
|
-
|
|
33
|
+
async update(id: Id, data: D, params?: P): Promise<T>
|
|
34
|
+
async update(id: ObjectId, data: D, params?: P): Promise<T>
|
|
35
|
+
async update(id: Id | ObjectId, data: D, params?: P): Promise<T> {
|
|
36
|
+
return this._update(id as Id, data, params)
|
|
31
37
|
}
|
|
32
38
|
|
|
39
|
+
async patch(id: ObjectId, data: Partial<D>, params?: P): Promise<T>
|
|
33
40
|
async patch(id: Id, data: Partial<D>, params?: P): Promise<T>
|
|
34
41
|
async patch(id: null, data: Partial<D>, params?: P): Promise<T[]>
|
|
35
|
-
async patch(id: NullableId, data: Partial<D>, params?: P): Promise<T | T[]> {
|
|
36
|
-
return this._patch(id, data, params)
|
|
42
|
+
async patch(id: NullableId | ObjectId, data: Partial<D>, params?: P): Promise<T | T[]> {
|
|
43
|
+
return this._patch(id as NullableId, data, params)
|
|
37
44
|
}
|
|
38
45
|
|
|
39
46
|
async remove(id: Id, params?: P): Promise<T>
|
|
47
|
+
async remove(id: ObjectId, params?: P): Promise<T>
|
|
40
48
|
async remove(id: null, params?: P): Promise<T[]>
|
|
41
|
-
async remove(id: NullableId, params?: P): Promise<T | T[]> {
|
|
42
|
-
return this._remove(id, params)
|
|
49
|
+
async remove(id: NullableId | ObjectId, params?: P): Promise<T | T[]> {
|
|
50
|
+
return this._remove(id as NullableId, params)
|
|
43
51
|
}
|
|
44
52
|
}
|
package/src/resolvers.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ObjectId } from 'mongodb'
|
|
2
|
+
|
|
3
|
+
export type ObjectIdParam = string | number | ObjectId
|
|
4
|
+
|
|
5
|
+
export type IdQueryObject<T> = {
|
|
6
|
+
$in?: T[]
|
|
7
|
+
$nin?: T[]
|
|
8
|
+
$ne?: T
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const toObjectId = (value: ObjectIdParam) => new ObjectId(value)
|
|
12
|
+
|
|
13
|
+
export async function resolveObjectId(value: ObjectIdParam) {
|
|
14
|
+
return toObjectId(value)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export async function resolveQueryObjectId(
|
|
18
|
+
value: IdQueryObject<ObjectIdParam>
|
|
19
|
+
): Promise<IdQueryObject<ObjectId>>
|
|
20
|
+
export async function resolveQueryObjectId(value: ObjectIdParam): Promise<ObjectId>
|
|
21
|
+
export async function resolveQueryObjectId(value: ObjectIdParam | IdQueryObject<ObjectIdParam>) {
|
|
22
|
+
if (typeof value === 'string' || typeof value === 'number' || value instanceof ObjectId) {
|
|
23
|
+
return toObjectId(value)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const convertedObject: IdQueryObject<ObjectId> = {}
|
|
27
|
+
|
|
28
|
+
if (Array.isArray(value.$in)) {
|
|
29
|
+
convertedObject.$in = value.$in.map(toObjectId)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (Array.isArray(value.$nin)) {
|
|
33
|
+
convertedObject.$nin = value.$nin.map(toObjectId)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (value.$ne !== undefined) {
|
|
37
|
+
convertedObject.$ne = toObjectId(value.$ne)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return convertedObject
|
|
41
|
+
}
|